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!