Android Version Code Tricks

Spróbujmy tę opcję. Najpierw skonfigurujemy aplikację i podamy 1 jako domyślny versionCode i nadpiszemy go na 2 dla wszystkich wariantów wyjścia:

Ale jeśli zajrzymy do pliku BuildConfig zobaczymy, że kod wersji wciąż jest ustawiony na 1. Choć jeśli zajrzymy do wynikowego AndroidManifest zobaczymy kod wersji poprawnie ustawiony na 2.
Błąd czy cecha? Dowiedzmy się co się dzieje.

Wewnątrz kodu możemy uzyskać dostęp do kodu wersji z BuildConfig.VERSION_CODE lub z PackageManager.packageInfo.versionCode:

Po uruchomieniu kodu w Logcat zobaczymy dokładnie to, co zaobserwowaliśmy powyżej:

Powodem, dla którego tak się dzieje jest to, że w android gradle build tools istnieją dwa oddzielne zadania do generowania pliku BuildConfig oraz do przetwarzania AndroidManifest.

Jeśli zajrzymy do GenerateBuildConfig zobaczymy, że właściwość VERSION_CODE jest generowana z metody getVersionCode():

I że getVersionCode odnosi się do wartości przechowywanej w variantConfiguration:

W przeciwieństwie do generowania BuildConfig w ProcessApplicationManifest widzimy, że kod wersji jest pobierany z apkData.

Jeżeli sprawdzimy variantConfiguration i apkData przed i po ustawieniu override kodu wersji:

Zobaczymy, że wartość wewnątrz wyjścia apkData została zmieniona, chociaż oryginalna wartość w variantConfiguration pozostaje taka sama (zgodnie z oczekiwaniami):

Jak stwierdzono w tej kwestii, jest to zrobione celowo ze względów wydajnościowych.

Wniosek

Bądź ostrożny, jeśli używasz setVersionCodeOverride, ponieważ możesz mieć różne kody wersji w BuildConfig i AndroidManifest.

Według dokumentacji zalecanym sposobem sprawdzenia kodu wersji jest dostęp do niego przez PackageManager, a nie przez BuildConfig:

Jeszcze lepszym rozwiązaniem jest posiadanie logiki wersjonowania poza build.gradle i dostarczenie jej przez parametr gradle przez twój CI.

Jest to również mądry wybór, aby nie polegać zbytnio na BuildConfig.VERSION_CODE. Dla przypadków migracji lepiej jest wprowadzić własne lokalne wersjonowanie (tak jak to jest zrobione z bazami danych SQL).

Szczęśliwe kodowanie!