Android Version Code Tricks

Lad os prøve denne mulighed. Først vil vi opsætte app og give 1 som standard versionCode og vil overskrive det til 2 for alle variantudgange:

Men hvis vi derefter ser inde i BuildConfig filen vil vi se, at versionskode stadig er indstillet til 1. Selvom hvis vi ser i resulterende AndroidManifest vil vi se versionskode korrekt indstillet til 2.
Bug eller funktion? Lad os finde ud af, hvad der sker.

Inden for koden kan vi få adgang til versionskoden fra BuildConfig.VERSION_CODE eller fra PackageManager.packageInfo.versionCode:

Når vi kører koden i Logcat, vil vi se præcis det, vi har observeret ovenfor:

Grunden til at dette sker er, at der i android gradle build-værktøjer er to separate opgaver til generering af BuildConfig-filen og til behandling af AndroidManifest.

Hvis vi kigger inde i GenerateBuildConfig ser vi, at VERSION_CODE-egenskaben genereres fra getVersionCode()-metoden:

Og at getVersionCode refererer til værdi gemt i variantConfiguration:

I modsætning til generering af BuildConfig i ProcessApplicationManifest ser vi, at versionskoden hentes fra apkData.

Hvis vi tjekker variantConfiguration og apkData før og efter vi indstiller versionskode override:

Vi vil se, at værdien inde i output apkData blev ændret, selvom den oprindelige værdi i variantConfiguration forbliver den samme (som forventet):

Som det fremgår af dette problem, er det gjort med vilje af hensyn til ydeevnen.

Konklusion

Vær forsigtig, hvis du bruger setVersionCodeOverride, da du måske har forskellige versionskoder i BuildConfig og AndroidManifest.

I henhold til dokumentationen er den anbefalede måde at kontrollere versionskoden også at få adgang til den via PackageManager, ikke via BuildConfig:

Et endnu bedre valg er at have versioneringslogik uden for build.gradle og levere den via gradle-parameter af din CI.

Det er også et klogt valg ikke at stole meget i din kodebase på BuildConfig.VERSION_CODE. For migrationstilfælde er det bedre at indføre din egen lokale versionering (som det er gjort med SQL-databaser).

Happy coding!