Android Versie Code Tricks

Laten we deze optie eens proberen. Eerst zullen we setup app en geef 1 als standaard versieCode en zal overschrijven naar 2 voor alle variant uitgangen:

Maar als we dan kijken in BuildConfig bestand zullen we zien dat de versie code is nog steeds ingesteld op 1. Hoewel als we kijken naar resulterende AndroidManifest zullen we zien versiecode correct ingesteld op 2.
Bug of functie? Laten we eens kijken wat er aan de hand is.

In de code kunnen we de versie code benaderen vanuit BuildConfig.VERSION_CODE of vanuit PackageManager.packageInfo.versionCode:

Nadat we de code in Logcat hebben uitgevoerd zien we precies wat we hierboven hebben waargenomen:

De reden waarom dit gebeurt is dat in android gradle build tools er twee afzonderlijke taken zijn voor het genereren van BuildConfig bestand en voor het verwerken van AndroidManifest.

Als we kijken in GenerateBuildConfig zien we dat VERSION_CODE eigenschap wordt gegenereerd uit getVersionCode() methode:

En dat getVersionCode verwijst naar waarde die is opgeslagen in variantConfiguration:

In tegenstelling tot het genereren van BuildConfig in ProcessApplicationManifest zien we dat de versiecode wordt opgehaald uit apkData.

Als we variantConfiguration en apkData controleren voor en na het instellen van de versiecode override:

We zullen zien dat de waarde in de output apkData is gewijzigd, hoewel de oorspronkelijke waarde in variantConfiguration hetzelfde blijft (zoals verwacht):

Zoals in dit probleem wordt gesteld, wordt dit met opzet gedaan om prestatieredenen.

Conclusie

Wees voorzichtig als u setVersionCodeOverride gebruikt, omdat u verschillende versiecodes kunt hebben in BuildConfig en AndroidManifest.

Ook volgens de documentatie is de aanbevolen manier om de versiecode te controleren toegang te krijgen via PackageManager, niet via BuildConfig:

Nog beter is het om de versielogica buiten build.gradle te hebben en deze via gradle-parameters aan te bieden door uw CI.

Ook is het een verstandige keuze om in uw codebase niet veel te vertrouwen op BuildConfig.VERSION_CODE. Voor migratie gevallen kun je beter je eigen lokale versiebeheer invoeren (zoals het wordt gedaan met SQL-databases).

Happy coding!