Een lopend project migreren naar AndroidX – niet zo’n liefdesverhaal

Migrate a current project to AndroidX

Vorige week ben ik begonnen met het migreren van een recent project naar AndroidX-bibliotheken. De app is oorspronkelijk gebouwd in 2015 en bevat dus wat oudere codes. Ik heb de Android-documentatie gevolgd over het migreren van een bestaand project naar AndroidX. Volgens de documentatie is de migratie vrij eenvoudig… Nou, dat is het niet.

AndroidX

In september 2018 bracht Google hun 1.0 stabiele versie van AndroidX uit. AndroidX is een belangrijke verbetering ten opzichte van de oorspronkelijke Android Support Libraries. In tegenstelling tot de Support Library wordt AndroidX los van het Android OS verstuurd en biedt het achterwaartse compatibiliteit met alle Android-releases. AndroidX vervangt de Supportbibliotheek volledig door het aanbieden van feature parity en nieuwe libraries.

Laten we starten met het migreren naar AndroidX

Eerst heb ik mijn Android Studio geüpdatet naar 3.2. Daarna heb ik de gradle plugin-versie van het project bijgewerkt. Vanaf dat moment was ik in staat om te migreren naar AndroidX met behulp van Android Studio. In Android Studio ga je naar Refactor > Migreren naar AndroidX. Op dat moment worden er veel bestanden gewijzigd. De meeste veranderingen zagen er zo uit:

AndroidX implementation

De applicatie maakt gebruik van enkele libraries van derden. Daarom moesten we voor onze migratie nog wat extra’s doen. In het gradle.properties bestand moesten we deze eigenschappen toevoegen:

AndroidX

Jetifier

De standalone Jetifier-tool migreert support-library-dependent libraries om in plaats daarvan te vertrouwen op de equivalente AndroidX-pakketten. Met de tool kunt u een individuele library direct migreren, in plaats van gebruik te maken van de Android gradle plugin gebundeld met Android Studio.

Klaar voor te bouwen

Na wat schoonmaken en enkele kleine aanpassingen te doen heb ik het project kunnen bouwen. Ik ben met de applicatie begonnen en op het eerste gezicht zag alles er goed uit! Mooi, hè?! Dus heb ik een ontwerp gemaakt voor onze klant. Op dit moment was ik tevreden, de migratie was niet al te moeilijk en de applicatie werkte op het eerste gezicht prima op mijn computer en fysieke apparaat.

De app crashte bij het opstarten…

Mijn tevredenheid duurde niet lang. Onze klant meldde dat de app crashte bij het opstarten. Zoals gebruikelijk bij crashes ging ik naar onze crash reporting tool om het probleem nader te bekijken. Na wat debugging vond ik het probleem. In het project hebben we deze library gebruikt. We hebben de versie van deze plugin geüpdatet naar de nieuwste versie. Dit was een oplossing voor de opstartcrash. Maar wacht… Ik heb Jetifier toch ingeschakeld? Waarom is de app niet gecrasht op mijn apparaat? Deze tool zou me moeten helpen om te voorkomen dat ik een versie van een third party library gebruik die niet compatibel is met AndroidX. Ik raad je echt aan om al je externe libraries te controleren en hun AndroidX-compatibiliteit.

Hey klant, onze nieuwe versie is onderweg…

Het werkt op mijn apparaat…

Bovenstaande aanpassingen hebben geen verschil gemaakt aan de crash bij mijn klant. Op dat moment begon ik te zoeken naar wat het verschil kon zijn tussen de build op mijn apparaat en de build die door Beta werd gedistribueerd. De reden hiervoor was tamelijk eenvoudig. In ons project hebben we 2 buildtypes gehad, Debug en Release.

Hier zag ik het verschil tussen de builds. Je kunt in onze release build zien dat we onze applicatie hebben geminimaliseerd door gebruik te maken van aangepaste ProguardFiles. Na wat zoeken vond ik deze quote op het internet:

Using default Proguard rules can save you time and pain, especially (but not limited to) when migrating to AndroidX.

Oh ja, dit wordt leuk, we gebruiken aangepaste Proguard bestanden 🎉 ….

Blijkbaar heeft de AndroidX-migratietool de regels van Proguard niet bijgewerkt… Eerst ben ik door het project gaan zoeken naar android.support.(widget) Elke regel code heb ik veranderd in androidx.(widget).

En dan moest ik nog deze regels met code veranderen.

AndroidX proguardFile

R8

Op dat moment realiseerde ik me dat de migratie niet zo eenvoudig was zoals de Android-documentatie aangeeft. Er waren veel meer dingen die ik moest veranderen dan alleen maar migreren naar AndroidX-libraries. De bovenstaande aanpassingen hebben voorkomen dat de release build crashte bij het opstarten, maar de applicatie werkte niet meer zoals voorheen… Sommige resources werden niet gevonden, klassen werden niet gevonden… Op dat moment zat er een 3-letterwoord in mijn hoofd.

Door het project opnieuw te bouwen, kregen de logs mijn aandacht…

Volgens de Android-documentatie is R8, wanneer je Android Studio 3.4 of Android Gradle plugin 3.4.0 en hoger gebruikt, de standaard compiler die de Java-bytecode van je project omzet in het DEX-formaat dat op het Android-platform draait. We hebben de poging gewaagd door R8 uit te schakelen. Misschien is dit de reden dat onze app niet meer werkt zoals voorheen.

android.enableR8=false

Voor meer informatie over R8 raad ik je echt aan om een kijkje te nemen op deze blogpost.

Door deze eigenschap in te stellen, zag alles er goed uit en werkte het weer als voorheen. Complete-program optimization is moeilijk! ProGuard heeft 15 jaar ontwikkeling en testen achter de rug. Miljoenen ontwikkelaars hebben het toegepast op miljoenen apps, wat een schat aan feedback heeft opgeleverd over gewone code en ongebruikelijke code. De Android R8 is veel jonger, met een team dat actief bezig is met het verbeteren van de stabiliteit en het uitbreiden van de functionaliteit.

Conclusie

We wilden een stabiel product met behulp van AndroidX-libraries en een release build waarvan de code geoptimaliseerd was. Het doel was om ons huidige project te migreren naar AndroidX. Dit doel werd bereikt. De extra tooling voor optimaliseren van de code was een aanvulling op dit doel. Het leek erop dat we veel extra configuratie moesten doen om met R8 en Proguard te kunnen werken, terwijl onze aangepaste Proguard stabiel en bewezen was.

Dus houd in gedachten, AndroidX migratie is meer dan het veranderen van de Android Support-Libraries naar AndroidX-libraries en kan moeilijk zijn in bestaande grote projecten.

Heb je vragen over deze blog? Je mag me altijd contacteren via jordan.de.vogelaere@jidoka.be

Interessante links

https://proandroiddev.com/what-are-you-keeping-from-me-44ece21f4631

https://www.guardsquare.com/en/blog/proguard-and-r8

https://developer.android.com/jetpack/androidx/migrate

wij kunnen u helpen!

Pardon? Een PWA?

Lees meer

Het maken van een showcase app

Lees meer

Hoe kunnen softwareteams twee keer zoveel waarde in half zoveel tijd leveren?

Lees meer