I dag har ingen tålmodigheden til at vente på, at en app indlæses. I det mobile økosystem er responsivitet forskellen på, om en bruger bliver i appen eller sletter den inden for få sekunder. At få en kompleks grænseflade til at indlæses øjeblikkeligt kræver, at man går ud over konventionel kodeoptimering og fokuserer på, hvordan enheden behandler instruktioner, før de når skærmen.
For at imødegå opstartsforsinkelser har Google introduceret Baseline Profiles , et banebrydende værktøj, der giver udviklere mulighed for at markere, hvilke kodestier der er vigtige. Ved at gøre dette forhindrer vi, at enheden skal "opdage", hvordan appen køres første gang, hvilket giver problemfri ydeevne fra den allerførste opstart , uanset om det er en ren installation eller en opdatering.
Hvad er baselineprofiler præcist, og hvordan fungerer de?
For at forstå dem skal du først vide, at Android bruger Android Runtime (ART). Traditionelt er kode blevet udført ved hjælp af Just-In-Time (JIT) kompilering , som oversætter koden, mens appen kører, eller Ahead-Of-Time (AOT) kompilering , som gør det hele på forhånd. Problemet med JIT er, at det kan forårsage mindre hakken eller initial langsommelighed, fordi koden ikke er optimeret fra starten.
Baselineprofiler fungerer som en hovedvejledning. De er i bund og grund en liste over klasser og metoder, som systemet skal prækompilere ved hjælp af AOT, før brugeren åbner appen. På denne måde behøver runtime-programmet ikke at fortolke koden undervejs, hvilket kan resultere i en hastighedsforbedring på op til 30 % ved den første udførelse.
I modsætning til Cloud Profiles, som er afhængige af, at tusindvis af brugere bruger appen, og at Google Play tilføjer disse data (en proces, der tager dage), leveres Baseline Profiles direkte i Android App Bundle (AAB) . Det betyder, at optimering er tilgængelig med det samme, hvilket eliminerer den "træge" periode, som nyligt opdaterede versioner ofte oplever.
Hvornår er det vigtigt at implementere denne teknik?
Ikke alle applikationer kræver samme niveau af optimering, men der er scenarier, hvor de er en livredder. Brug af profiler er afgørende for at reducere koldstartstiden , især hvis din velkomstskærm har store afhængigheder eller kompleks gengivelse. Hvis du bemærker, at den første opstart er langsom, men den anden er lynhurtig, har du et kompileringsproblem, som profiler kan løse.
Desuden er de ikke kun til opstart. De er yderst nyttige til at forbedre rulningsflydendeheden . Ved at prækompilere listelogik og animationer forhindrer du tabte frames, hvilket gør indholdsnavigationen utrolig gnidningsløs. De er også ideelle til at optimere tilbagevendende funktioner , såsom checkout- eller registreringsflowet, hvilket sikrer, at de mest brugte stier er de hurtigste.
Trin-for-trin konfiguration af generationsmodulet
Den mest moderne måde at implementere dette på er gennem et dedikeret modul i Android Studio. For at starte skal du gå til Nyt modul og vælg skabelonen Generator for basislinjeprofilerHer definerer du målapplikationen, modulnavnet (f.eks. baselineprofile) og det foretrukne sprog, enten Kotlin eller Java.
Denne proces automatiserer oprettelsen af ​​et testmiljø. Guiden konfigurerer plugin'et. androidx.baselineprofile og vil tilføje biblioteket profilinstaller i applikationsmodulet. Sidstnævnte er ansvarlig for at sikre, at profilen er korrekt installeret på brugernes enheder, selv på ældre versioner af Android, der ikke understøtter cloudprofiler.
En vigtig teknisk detalje er håndtering af obfuskation. For at profilen kan være gyldig, skal den genereres på en variant, hvor `isMinifyEnabled` er indstillet til `false` . Du skal dog ikke bekymre dig om den endelige version: R8 er i stand til at omskrive profilreglerne, så de matcher den obfuskerede kode i produktions-APK'en, og dermed opretholde maksimal sikkerhed og størrelsesoptimering.
Oprettelse af kritiske brugerrejser (CUJ)
En basisprofil, der kun starter appen, er nyttig, men for at få mest muligt ud af dens ydeevne skal vi definere Kritiske brugerrejserDette gøres inden for klassen BaselineProfileGenerator bruger reglen BaselineProfileRuleInde i blokken collectVi skal simulere de faktiske handlinger, som en bruger ville foretage.
Hvis din app for eksempel har en asynkron belastning, er det ikke nok bare at kalde startActivityAndWait()Du skal implementere smarte ventetider, så systemet registrerer den kode, der udføres, når indholdet endelig vises. Dette opnås ved at interagere med grænsefladen via UiAutomator, leder efter specifikke elementer og venter på, at de bliver synlige, før testen slutter.
For en avanceret arbejdsgang kan du programmere generatoren rul lister lodret ved hjælp af metoden flingNaviger til detaljerede skærme eller administrer endda systemtilladelsesdialoger. Jo mere præcis den simulerede gennemgang er, desto mere præcis vil den genererede profil være, og derfor... Jo mere jævn oplevelsen bliver faktiske slutbruger.
Ydelsesgenerering og validering
Når generatoren er skrevet, er det tid til at køre den. Ideelt set bør du bruge en Gradle-administreret enhed (GMD) eller en emulator med et billede aosp at have root-tilladelser, selvom nyere versioner af biblioteket allerede tillader generering af profiler på fysiske enheder med Android 13 eller nyere uden komplikationer.
Når du kører Gradle-opgaven :app:generateBaselineProfileSystemet starter appen flere gange, indsamler de kaldte klasser og metoder og opretter en fil. baseline-prof.txtDenne fil placeres automatisk i appens mappe med aktiver, klar til at blive pakket i AAB.
For at finde ud af om det rent faktisk virkede, brugte vi Jetpack MacrobenchmarkVi har lavet en test, der sammenligner to scenarier: et med CompilationMode.None() (uden optimering) og en anden med CompilationMode.Partial() (ved hjælp af profilen). Ved analyse af metrikken tidTilFuldvisningDet er almindeligt at observere drastiske reduktioner i millisekunder, hvilket bekræfter, at kritisk kode ikke længere behøver at blive kompileret i realtid.
I virkelige scenarier, f.eks. med store apps, er det blevet observeret, at Just-in-Time (JIT)-tråden går fra at være optaget 25 % af tiden til kun 3 %. Dette frigør CPU-ressourcer og reducerer enhedens termiske belastning, hvilket resulterer i en mere stabil og effektiv app , især på enheder i den lavere ende.
Implementering af Baseline Profiles er en af ​​de mest omkostningseffektive investeringer i brugeroplevelsen, da det gør det muligt for software at føles let og responsiv fra første sekund. Ved at kombinere brugen af ​​benchmarkmoduler til at generere og konstant validere opstartstider kan enhver udvikler omdanne en langsom applikation til et øjeblikkeligt, professionelt værktøj , der fastholder brugerne.