Tegenwoordig heeft niemand meer het geduld om te wachten tot een app geladen is. In het mobiele ecosysteem is responsiviteit het verschil tussen een gebruiker die de app blijft gebruiken of hem binnen enkele seconden verwijdert. Om een ​​complexe interface direct te laten laden, moet je verder kijken dan conventionele code-optimalisatie en je concentreren op hoe het apparaat instructies verwerkt voordat ze op het scherm verschijnen.
Om opstartvertragingen aan te pakken, heeft Google Baseline Profiles geïntroduceerd , een baanbrekende tool waarmee ontwikkelaars kunnen aangeven welke code-paden essentieel zijn. Hierdoor hoeft het apparaat niet meer te "ontdekken" hoe de app de eerste keer moet worden uitgevoerd, wat zorgt voor soepele prestaties vanaf de allereerste keer opstarten , of het nu een schone installatie of een update betreft.
Wat zijn basisprofielen precies en hoe werken ze?
Om ze te begrijpen, moet je eerst weten dat Android gebruikmaakt van de Android Runtime (ART). Traditioneel werd code uitgevoerd met behulp van Just-In-Time (JIT) compilatie , waarbij de code wordt vertaald terwijl de app draait, of Ahead-Of-Time (AOT) compilatie , waarbij alles van tevoren gebeurt. Het probleem met JIT is dat het kleine haperingen of aanvankelijke traagheid kan veroorzaken, omdat de code niet vanaf het begin is geoptimaliseerd.
Baselineprofielen fungeren als een overkoepelende handleiding. Het zijn in feite lijsten met klassen en methoden die het systeem met behulp van AOT moet precompileren voordat de gebruiker de app opent. Op deze manier hoeft de runtime de code niet ter plekke te interpreteren, wat kan leiden tot een snelheidsverbetering van wel 30% bij de eerste uitvoering.
In tegenstelling tot cloudprofielen, die afhankelijk zijn van duizenden gebruikers die de app gebruiken en Google Play die gegevens toevoegt (een proces dat dagen duurt), worden basisprofielen direct in de Android-appbundel (AAB) geleverd . Dit betekent dat optimalisatie onmiddellijk beschikbaar is, waardoor de "trage" periode die nieuwe updates vaak ervaren, wordt geëlimineerd.
Wanneer is het essentieel om deze techniek toe te passen?
Niet alle applicaties vereisen dezelfde mate van optimalisatie, maar er zijn situaties waarin ze van onschatbare waarde zijn. Het gebruik van profielen is cruciaal voor het verkorten van de opstarttijd , vooral als uw splashscreen zware afhankelijkheden of complexe rendering vereist. Als u merkt dat de eerste keer opstarten traag is, maar de tweede keer razendsnel, dan is er een compilatieprobleem dat met profielen kan worden opgelost.
Bovendien zijn ze niet alleen nuttig voor startups. Ze zijn ook uitermate geschikt om de scrollvloeiendheid te verbeteren . Door de logica en animaties van lijsten vooraf te compileren, voorkom je dat frames worden overgeslagen, waardoor de navigatie door de content ongelooflijk soepel aanvoelt. Ze zijn ook ideaal voor het optimaliseren van terugkerende functies , zoals het afreken- of registratieproces, zodat de meest gebruikte paden het snelst zijn.
Stapsgewijze configuratie van de generatiemodule
De modernste manier om dit te implementeren is via een speciale module in Android Studio. Om te beginnen moet je naar Nieuwe module en selecteer de sjabloon BasisprofielgeneratorHier definieert u de doelapplicatie en de modulenaam (bijvoorbeeld, baselineprofile) en de voorkeurstaal, Kotlin of Java.
Dit proces automatiseert het aanmaken van een testomgeving. De wizard configureert de plugin. androidx.baselineprofile en zal de bibliotheek toevoegen profielinstallateur in de applicatiemodule. Deze module is verantwoordelijk voor de correcte installatie van het profiel op de apparaten van gebruikers, zelfs op oudere Android-versies die geen cloudprofielen ondersteunen.
Een belangrijk technisch detail is het beheer van de obfuscatie. Om het profiel geldig te laten zijn, moet het gegenereerd worden op een variant waar `isMinifyEnabled` is ingesteld op `false` . Maar maak je geen zorgen over de uiteindelijke versie: R8 kan de profielregels herschrijven zodat ze overeenkomen met de geobfusceerde code van de productie-APK, waardoor maximale beveiliging en optimale grootte behouden blijven.
Het creëren van kritieke gebruikerservaringen (CUJ)
Een basisprofiel dat alleen de app start, is handig, maar om de prestaties optimaal te benutten, moeten we de Kritieke gebruikerstrajectenDit gebeurt binnen de les. BaselineProfileGenerator utilizando la regla BaselineProfileRule. Binnen het blok collectWe moeten de daadwerkelijke handelingen van een gebruiker simuleren.
Als uw app bijvoorbeeld asynchroon laadt, is het niet voldoende om alleen maar de functie aan te roepen. startActivityAndWait()Je moet slimme wachtmechanismen implementeren, zodat het systeem de code registreert die wordt uitgevoerd wanneer de inhoud uiteindelijk verschijnt. Dit wordt bereikt door interactie met de interface via UiAutomatorwaarbij naar specifieke elementen wordt gezocht en wordt gewacht tot deze zichtbaar worden voordat de test eindigt.
Voor een geavanceerde workflow kunt u de generator programmeren. Lijsten verticaal scrollen met behulp van de methode flingNavigeer naar gedetailleerde schermen of beheer zelfs dialoogvensters voor systeemtoegangsrechten. Hoe nauwkeuriger de gesimuleerde rondleiding, hoe nauwkeuriger het gegenereerde profiel zal zijn, en dus... Hoe soepeler de ervaring zal zijn daadwerkelijke eindgebruiker.
Prestatiegeneratie en -validatie
Zodra de generator geschreven is, is het tijd om hem uit te voeren. Idealiter zou je een Gradle-beheerd apparaat (GMD) of een emulator met een afbeelding aosp rootrechten hebben, hoewel recente versies van de bibliotheek het al mogelijk maken om profielen te genereren op fysieke apparaten met Android 13 of hoger zonder complicaties.
Bij het uitvoeren van de Gradle-taak :app:generateBaselineProfileHet systeem start de app meerdere keren, verzamelt de aangeroepen klassen en methoden en maakt een bestand aan. baseline-prof.txtDit bestand wordt automatisch in de assets-map van de app geplaatst, klaar om te worden opgenomen in het AAB-pakket.
Om erachter te komen of het echt werkte, gebruikten we Jetpack MacrobenchmarkWe hebben een test ontwikkeld die twee scenario's vergelijkt: een met CompilationMode.None() (zonder optimalisatie) en een andere met CompilationMode.Partial() (met behulp van het profiel). Bij het analyseren van de meetwaarde tijdTotVolledigeWeergaveHet is gebruikelijk om drastische reducties in milliseconden te zien, wat bevestigt dat kritieke code niet langer in realtime hoeft te worden gecompileerd.
In praktijksituaties, zoals bij grootschalige applicaties, is gebleken dat de Just-in-Time (JIT)-thread van 25% van de tijd naar slechts 3% van de tijd wordt belast. Dit maakt CPU-bronnen vrij en vermindert de warmtebelasting van het apparaat, wat resulteert in een stabielere en efficiëntere applicatie , met name op minder krachtige apparaten.
Het implementeren van baselineprofielen is een van de meest kosteneffectieve investeringen in gebruikerservaring, omdat software hierdoor vanaf de eerste seconde licht en responsief aanvoelt. Door benchmarkmodules te gebruiken voor het genereren en continu valideren van opstarttijden, kan elke ontwikkelaar een trage applicatie transformeren in een direct, professioneel hulpmiddel dat gebruikers aan zich bindt.