Android verzió kódtrükkök
Próbáljuk ki ezt a lehetőséget. Először is beállítjuk az alkalmazást és megadjuk az 1-et, mint alapértelmezett versionCode-ot és felülbíráljuk 2-re az összes kimeneti változatnál:
De aztán ha belenézünk a BuildConfig
fájlba, akkor látjuk, hogy a verzió kód még mindig 1-re van állítva. Bár ha megnézzük a kapott AndroidManifest-et, akkor a verzió kód helyesen 2-re van állítva.
Bug vagy feature? Derítsük ki, mi történik.
A kódon belül a BuildConfig.VERSION_CODE
vagy a PackageManager.packageInfo.versionCode
kódból elérhetjük a verzió kódot:
A kód futtatása után a Logcat-ben pontosan azt fogjuk látni, amit fentebb megfigyeltünk:
Azért történik ez, mert az android gradle build eszközökben két külön feladat van a BuildConfig fájl generálására és az AndroidManifest feldolgozására.
Ha belenézünk a GenerateBuildConfig fájlba, akkor láthatjuk, hogy a VERSION_CODE
tulajdonságot a getVersionCode()
metódusból generálja:
És hogy a getVersionCode
a variantConfiguration
-ben tárolt értékre utal:
A ProcessApplicationManifestben a BuildConfig generálásával ellentétben azt látjuk, hogy a verzió kódot a apkData
-ből nyerjük.
Ha a variantConfiguration
és apkData
előtt és után a verzió kód felülbírálatát állítjuk be:
Meglátjuk, hogy az apkData kimeneten belüli érték megváltozott, bár az eredeti érték a variantConfiguration
-ben ugyanaz maradt (ahogy várható):
Mint ebben a kérdésben szerepel, ez szándékosan történik a teljesítmény érdekében.
Következtetés
Legyen óvatos, ha a setVersionCodeOverride
-t használja, mivel előfordulhat, hogy a BuildConfig és az AndroidManifest különböző verzió kódokat tartalmaz.
A dokumentáció szerint a verzió kód ellenőrzésének ajánlott módja a PackageManager-en keresztül történő elérés, nem pedig a BuildConfig-on keresztül:
Még jobb, ha a verziókezelési logika a build.gradle-n kívül van, és azt gradle paraméteren keresztül biztosítja a CI.
Az is bölcs döntés, hogy a kódbázisodban ne nagyon támaszkodj a BuildConfig.VERSION_CODE
-re. Migrációs esetekben jobb, ha saját helyi verziókezelést vezetsz be (ahogyan az SQL adatbázisok esetében is történik).
Boldog kódolást!