Android Version Code Tricks

Essayons cette option. Tout d’abord, nous allons configurer l’application et fournir 1 comme versionCode par défaut et le remplacer par 2 pour toutes les sorties de variantes:

Mais ensuite, si nous regardons à l’intérieur du fichier BuildConfig, nous verrons que le code de version est toujours défini à 1. Bien que si nous regardons dans AndroidManifest résultant, nous verrons le code de version correctement défini à 2.
Bug ou fonctionnalité ? Voyons ce qui se passe.

Dans le code, nous pouvons accéder au code de version à partir de BuildConfig.VERSION_CODE ou de PackageManager.packageInfo.versionCode:

Après avoir exécuté le code dans Logcat, nous verrons exactement ce que nous avons observé ci-dessus :

La raison pour laquelle cela se produit est que dans les outils de construction android gradle il y a deux tâches séparées pour générer le fichier BuildConfig et pour traiter AndroidManifest.

Si nous regardons à l’intérieur de GenerateBuildConfig, nous verrons que la propriété VERSION_CODE est générée à partir de la méthode getVersionCode():

Et que getVersionCode fait référence à la valeur stockée dans variantConfiguration :

Contrairement à la génération de BuildConfig dans ProcessApplicationManifest, nous voyons que le code de version est récupéré dans apkData.

Si nous vérifions variantConfiguration et apkData avant et après avoir défini le code de version override :

Nous verrons que la valeur à l’intérieur de la sortie apkData a été modifiée bien que la valeur originale dans variantConfiguration reste la même (comme prévu) :

Comme indiqué dans ce problème, cela est fait intentionnellement pour des raisons de performance.

Conclusion

Faites attention si vous utilisez setVersionCodeOverride car vous pourriez avoir des codes de version différents dans BuildConfig et AndroidManifest.

Aussi, selon la documentation, la façon recommandée de vérifier le code de version est d’y accéder via PackageManager, pas via BuildConfig:

Mieux encore est d’avoir une logique de versionnement en dehors de build.gradle et de la fournir via un paramètre gradle par votre CI.

Aussi, c’est un choix sage de ne pas beaucoup compter dans votre codebase sur BuildConfig.VERSION_CODE. Pour les cas de migration, vous feriez mieux d’introduire votre propre versioning local (comme il est fait avec les bases de données SQL).

Happy coding!