Android-version kooditemput

Kokeillaan tätä vaihtoehtoa. Ensin asetamme sovelluksen ja annamme 1:n oletus versionCode:ksi ja ohitamme sen 2:ksi kaikissa varianttien ulostuloissa:

Mutta sitten, jos katsomme BuildConfig-tiedoston sisälle, näemme, että version koodiksi on edelleen asetettu 1. Tosin, jos katsomme tuloksena syntynyttä androidManifest:ia, näemme, että versiossa version koodin olevan oikein asetettuna arvoon 2.
Vika vai ominaisuus? Selvitetään, mitä tapahtuu.

Koodin sisällä pääsemme käsiksi versiokoodiin kohdasta BuildConfig.VERSION_CODE tai kohdasta PackageManager.packageInfo.versionCode:

Ajettuamme koodin Logcatissa näemme täsmälleen sen, minkä havaitsimme edellä:

Syy tähän on se, että android gradle build-työkaluissa on kaksi erillistä tehtävää BuildConfig-tiedoston tuottamiseen ja AndroidManifestin käsittelyyn.

Jos katsomme GenerateBuildConfig-tiedoston sisälle, näemme, että VERSION_CODE-ominaisuus generoidaan getVersionCode()-metodista:

Ja että getVersionCode viittaa arvoon, joka on tallennettu variantConfiguration:een:

Toisin kuin BuildConfigin generointi ProcessApplicationManifestissa näemme, että versiokoodi haetaan apkData:sta.

Jos tarkistamme variantConfiguration ja apkData ennen ja jälkeen versiokoodin asettamisen override:

Havaitsemme, että arvo ulostulon apkDatan sisällä muuttui, vaikka alkuperäinen arvo variantConfiguration:ssä pysyy samana (kuten odotettiin):

Kuten tässä ongelmassa todetaan, se on tehty tarkoituksella suorituskykysyistä.

Johtopäätös

Ole varovainen, jos käytät setVersionCodeOverride:aa, sillä BuildConfigissa ja AndroidManifestissa saattaa olla eri versiokoodit.

Dokumentaation mukaan suositeltava tapa tarkistaa versiokoodi on käyttää sitä PackageManagerin kautta, ei BuildConfigin kautta:

Jopa parempi on pitää versiointilogiikka build.gradlen ulkopuolella ja tarjota se gradle-parametrin kautta CI:ltäsi.

Myös on viisas valinta olla luottamatta koodipohjassasi paljoa BuildConfig.VERSION_CODE:ään. Migraatiotapauksia varten kannattaa ottaa käyttöön oma paikallinen versiointi (kuten SQL-tietokannoissa tehdään).

Happy coding!