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!