Android Version Code Tricks

Vi provar det här alternativet. Först ställer vi in appen och anger 1 som standard versionCode och åsidosätter den till 2 för alla varianter:

Men om vi tittar in i BuildConfig-filen ser vi att versionskoden fortfarande är inställd på 1. Om vi tittar in i den resulterande AndroidManifest ser vi dock att versionskoden är korrekt inställd på 2.
Bugg eller funktion? Låt oss ta reda på vad som händer.

Inuti koden kan vi komma åt versionskoden från BuildConfig.VERSION_CODE eller från PackageManager.packageInfo.versionCode:

När vi kört koden i Logcat kommer vi att se exakt vad vi observerat ovan:

Anledningen till att detta händer är att det i android gradle build tools finns två separata uppgifter för att generera BuildConfig-filen och för att behandla AndroidManifest.

Om vi tittar inuti GenerateBuildConfig ser vi att egenskapen VERSION_CODE genereras från metoden getVersionCode():

Och att getVersionCode hänvisar till värdet som lagras i variantConfiguration:

Till skillnad från generering av BuildConfig i ProcessApplicationManifest ser vi att versionskoden hämtas från apkData.

Om vi kontrollerar variantConfiguration och apkData före och efter att vi har ställt in versionskod override:

Vi ser att värdet i apkData ändrades, även om det ursprungliga värdet i variantConfiguration förblir detsamma (som förväntat):

Som anges i denna fråga görs det avsiktligt av prestandaskäl.

Slutsats

Var försiktig om du använder setVersionCodeOverride eftersom du kan ha olika versionskoder i BuildConfig och AndroidManifest.

Enligt dokumentationen är det rekommenderade sättet att kontrollera versionskoden att få tillgång till den via PackageManager, inte via BuildConfig:

Ett ännu bättre sätt är att ha versionslogik utanför build.gradle och tillhandahålla den via gradle-parameter av din CI.

Det är också ett klokt val att inte förlita sig så mycket på BuildConfig.VERSION_CODE i din kodbas. För migrationsfall är det bättre att införa din egen lokala versionering (som det görs med SQL-databaser).

Happy coding!