Automatisches Erstellen von Profilen für jeden App-Release mithilfe des Jetpacks
MacroBenchmark-Bibliothek und
BaselineProfileRule
Wir empfehlen Ihnen,
com.android.tools.build:gradle:8.0.0
oder höher verwenden (in Build enthalten)
bei der Verwendung von Baseline-Profilen verbessert.
So erstellen Sie ein neues Baseline-Profil:
- Richten Sie das Baseline-Profilmodul ein.
- Definieren Sie den JUnit-Test, der beim Generieren von Referenzprofilen hilft.
- Fügen Sie die Critical User Journeys (CUJs) hinzu, die Sie optimieren möchten.
- Generieren Sie das Basisprofil.
Nachdem Sie das Baseline-Profil generiert haben, führen Sie mit einem physischen Gerät die verbesserten Geschwindigkeiten messen.
Neues Baseline-Profil mit AGP 8.2 oder höher erstellen
Die einfachste Methode zum Erstellen eines neuen Baseline-Profils ist die Verwendung des Baseline-Profils Modulvorlage, verfügbar ab Android Studio Iguana und Android Gradle Plugin (AGP) 8.2.
Mit der Vorlage für das Android Studio Baseline Profile Generator-Modul wird die um ein neues Modul zu erstellen, Benchmark Referenzprofile. Wenn Sie die Vorlage ausführen, werden die meisten typischen Builds Konfiguration, Generierung von Baseline-Profilen und Bestätigungscode. Vorlage Erstellt Code zum Generieren und Benchmarken von Baseline-Profilen, um die App zu messen Start-up.
Baseline-Profilmodul einrichten
So führen Sie die Modulvorlage für das Baseline-Profil aus:
- Wählen Sie Datei > Neu > Neues Modul
- Wählen Sie die Vorlage Baseline Profile Generator (Baseline-Profil-Generator) im
Vorlagen und konfigurieren Sie ihn:
<ph type="x-smartling-placeholder">
Die Vorlage enthält die folgenden Felder:
- Zielanwendung: definiert, für welche App das Referenzprofil generiert wird. Wenn Ihr Projekt nur ein einziges App-Modul enthält, gibt es in dieser Liste nur ein Element.
- Module name: Der gewünschte Name für das Baseline-Profilmodul erstellt wird.
- Package name (Paketname): der Paketname, der für das Baseline-Profil verwendet werden soll -Modul.
- Sprache: Legen Sie fest, ob der generierte Code Kotlin- oder Java
- Build-Konfigurationssprache: Gibt an, ob Sie Kotlin verwenden möchten Script (KTS) oder Groovy für Ihre Build-Konfigurationsskripts
- Von Gradle verwaltetes Gerät verwenden: von Gradle verwaltete Geräte, testen Sie Ihre App.
- Klicken Sie auf Finish (Fertigstellen). Das neue Modul wird erstellt. Bei Verwendung der Quelle steuern, werden Sie möglicherweise aufgefordert, die neu erstellten Moduldateien Steuerung.
Baseline-Profilgenerator definieren
Das neu erstellte Modul enthält Tests zum Generieren und Benchmarking der
Baseline-Profil und Test nur für den grundlegenden App-Start Wir empfehlen Ihnen,
einschließlich CUJs und
erweiterter Start-up-Workflows. Stellen Sie sicher, dass alle Tests
die mit dem App-Start zusammenhängen, befinden sich in einem rule
-Block, wobei includeInStartupProfile
festgelegt ist.
an true
; Umgekehrt sollten Sie für eine optimale Leistung sicherstellen, dass Tests,
die mit dem App-Start zusammenhängen, nicht im Startprofil enthalten. App-Start
Optimierungen werden verwendet, um einen speziellen Teil eines Basisprofils zu definieren,
Startprofil.
Es vereinfacht die Verwaltbarkeit, wenn Sie diese CUJs außerhalb der generierten Baseline-Profil und Benchmark-Code, damit sie für beides verwendet werden können. Dieses bedeutet, dass Änderungen an Ihren CUJs konsistent verwendet werden.
Baseline-Profil generieren und installieren
Die Modulvorlage „Baseline-Profil“ fügt eine neue zu generierende Ausführungskonfiguration hinzu das Baseline-Profil. Wenn Sie Produkt-Flavor verwenden, erstellt Android Studio Mehrere Ausführungskonfigurationen, sodass Sie separate Baseline-Profile generieren können für jede Geschmacksrichtung.
<ph type="x-smartling-placeholder">Wenn die Konfiguration der Ausführung Baseline-Profil generieren abgeschlossen ist, wird
dem generierten Baseline-Profil
src/variant/generated/baselineProfiles/baseline-prof.txt
in dem Modul, für das ein Profil erstellt wird. Die Variantenoptionen sind entweder
Release-Build-Typ oder eine Build-Variante mit dem Release-Build-Typ
Das generierte Referenzprofil wird ursprünglich in build/outputs
erstellt. Die
der vollständige Pfad wird durch die Variante oder
den Geschmack der App bestimmt, für die ein Profil erstellt wird,
egal, ob Sie ein von Gradle verwaltetes Gerät oder ein verbundenes Gerät für die Profilerstellung verwenden. Wenn
verwenden Sie die im Code verwendeten Namen und die Build-Konfigurationen, die vom
wird das Baseline-Profil im
build/outputs/managed_device_android_test_additional_output/nonminifiedrelease/pixel6Api31/BaselineProfileGenerator_generate-baseline-prof.txt
-Datei. Vermutlich werden Sie
Sie müssen direkt mit dieser Version des generierten Baseline-Profils interagieren.
es sei denn, Sie kopieren sie manuell in die Zielmodule (nicht empfohlen).
Neues Baseline-Profil mit AGP 8.1 erstellen
Wenn Sie das Tag Vorlage für das Basisprofilmodul, verwenden Sie die MacroBenchmark-Modulvorlage und das Baseline-Profil-Gradle-Plug-in zum Erstellen ein neues Baseline-Profil erstellen. Diese Tools empfehlen wir für den Einstieg mit Android Studio Giraffe und AGP 8.1.
So erstellen Sie ein neues Baseline-Profil mithilfe von MacroBenchmark Modulvorlage und Gradle-Plug-in für Baseline-Profile:
- <ph type="x-smartling-placeholder"> </ph> festlegen ein MacroBenchmark-Modul in Ihrem Gradle-Projekt erstellen.
- Definieren Sie eine neue Klasse mit dem Namen
BaselineProfileGenerator
:class BaselineProfileGenerator { @get:Rule val baselineProfileRule = BaselineProfileRule() @Test fun startup() = baselineProfileRule.collect( packageName = "com.example.app", profileBlock = { startActivityAndWait() } ) }
Der Generator kann Interaktionen mit Ihrer App über den Start der App hinaus enthalten. So können Sie die Laufzeitleistung Ihrer App optimieren, z. B. Scrolllisten, das Ausführen von Animationen und die Navigation innerhalb eines
Activity
Siehe weitere Beispiele für Tests, bei denen@BaselineProfileRule
verwendet wird, um um kritische User Journeys zu verbessern. Gradle-Plug-in für Baseline-Profil hinzufügen (
libs.plugins.androidx.baselineprofile
) Das Plug-in macht es einfacher, um Basisprofile zu generieren und in Zukunft zu verwalten.Führen Sie den folgenden Befehl aus, um das Baseline-Profil zu generieren:
:app:generateBaselineProfile
oder:app:generateVariantBaselineProfile
Gradle-Aufgaben in der .Generator als instrumentierten Test ausführen auf einem gerooteten physischen Gerät, Emulator oder Gradle-verwaltetes Gerät Wenn Sie ein von Gradle verwaltetes Gerät verwenden, legen Sie
<ph type="x-smartling-placeholder">aosp
alssystemImageSource
fest, da Sie Root benötigen. Zugriff für den Baseline-Profilgenerator.Am Ende der Generierungsaufgabe wird das Baseline-Profil kopiert in
app/src/variant/generated/baselineProfiles
Neues Baseline-Profil ohne Vorlagen erstellen
Wir empfehlen, ein Baseline-Profil mit der Vorlage für das Basisprofilmodul (bevorzugt) oder eine Makro-Benchmark-Vorlage, aber Sie können das Baseline-Profil-Gradle-Plug-in verwenden. Weitere Informationen zur Gradle-Plug-in für Baseline Profile: siehe Konfigurieren Sie die Generierung von Baseline-Profilen.
So erstellen Sie ein Baseline-Profil mit dem Gradle-Plug-in für Baseline-Profile direkt:
- Erstellen Sie ein neues
com.android.test
-Modul. Beispiel::baseline-profile
. Datei
build.gradle.kts
konfigurieren für:baseline-profile
:- Wenden Sie das Plug-in
androidx.baselineprofile
an. - Achten Sie darauf, dass
targetProjectPath
auf das Modul:app
. - Optional: Fügen Sie einen
Gradle-managed device (GMD):
Im folgenden Beispiel ist das
pixel6Api31
. Wenn keine Angabe erfolgt, das Plug-in ein verbundenes Gerät verwendet, entweder emuliert oder physisch. - Wenden Sie die gewünschte Konfiguration an, wie im Folgenden gezeigt. Beispiel.
Kotlin
plugins { id("com.android.test") id("androidx.baselineprofile") } android { defaultConfig { ... } // Point to the app module, the module that you're generating the Baseline Profile for. targetProjectPath = ":app" // Configure a GMD (optional). testOptions.managedDevices.devices { pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) { device = "Pixel 6" apiLevel = 31 systemImageSource = "aosp" } } } dependencies { ... } // Baseline Profile Gradle plugin configuration. Everything is optional. This // example uses the GMD added earlier and disables connected devices. baselineProfile { // Specifies the GMDs to run the tests on. The default is none. managedDevices += "pixel6Api31" // Enables using connected devices to generate profiles. The default is // `true`. When using connected devices, they must be rooted or API 33 and // higher. useConnectedDevices = false }
Cool
plugins { id 'com.android.test' id 'androidx.baselineprofile' } android { defaultConfig { ... } // Point to the app module, the module that you're generating the Baseline Profile for. targetProjectPath ':app' // Configure a GMD (optional). testOptions.managedDevices.devices { pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) { device 'Pixel 6' apiLevel 31 systemImageSource 'aosp' } } } dependencies { ... } // Baseline Profile Gradle plugin configuration. Everything is optional. This // example uses the GMD added earlier and disables connected devices. baselineProfile { // Specifies the GMDs to run the tests on. The default is none. managedDevices ['pixel6Api31'] // Enables using connected devices to generate profiles. The default is // `true`. When using connected devices, they must be rooted or API 33 and // higher. useConnectedDevices false }
- Wenden Sie das Plug-in
Baseline-Profiltest in
:baseline-profile
erstellen Testmodul. Das folgende Beispiel zeigt einen Test, bei dem die App gestartet und gewartet wird, für die Inaktivität.Kotlin
class BaselineProfileGenerator { @get:Rule val baselineRule = BaselineProfileRule() @Test fun startupBaselineProfile() { baselineRule.collect("com.myapp") { startActivityAndWait() } } }
Java
public class BaselineProfileGenerator { @Rule Public BaselineProfileRule baselineRule = new BaselineProfileRule(); @Test Public void startupBaselineProfile() { baselineRule.collect( "com.myapp", (scope -> { scope.startActivityAndWait(); Return Unit.INSTANCE; }) ) } }
Aktualisieren Sie die Datei
build.gradle.kts
im Anwendungsmodul, z. B.:app
.- Wenden Sie das Plug-in
androidx.baselineprofile
an. - Fügen Sie dem Modul
:baseline-profile
einebaselineProfile
-Abhängigkeit hinzu.
Kotlin
plugins { id("com.android.application") id("androidx.baselineprofile") } android { // There are no changes to the `android` block. ... } dependencies { ... // Add a `baselineProfile` dependency on the `:baseline-profile` module. baselineProfile(project(":baseline-profile")) }
Cool
plugins { id 'com.android.application' id 'androidx.baselineprofile' } android { // No changes to the `android` block. ... } dependencies { ... // Add a `baselineProfile` dependency on the `:baseline-profile` module. baselineProfile ':baseline-profile"' }
- Wenden Sie das Plug-in
Profil durch Ausführen des
:app:generateBaselineProfile
erstellen oder:app:generateVariantBaselineProfile
-Gradle-Aufgaben.Am Ende der Generierungsaufgabe wird das Baseline-Profil kopiert in
app/src/variant/generated/baselineProfiles
Neues Baseline-Profil mit AGP 7.3–7.4 erstellen
Es ist möglich, Basisprofile mit AGP 7.3 bis 7.4 zu generieren, Es wird ein Upgrade auf AGP 8.1 empfohlen, damit Sie das Baseline-Profil verwenden können Gradle-Plug-in und die neuesten Funktionen
Wenn Sie Basisprofile mit AGP 7.3–7.4 erstellen müssen, sind die Schritte identisch wie in den Schritten für AGP 8.1 mit folgendem Code: Ausnahmen:
- Fügen Sie das Gradle-Plug-in für Baseline-Profile nicht hinzu.
- Führen Sie die Gradle-Aufgabe
./gradlew [emulator name][flavor][build type]AndroidTest
aus, um die Baseline-Profile zu generieren. Beispiel:./gradlew :benchmark:pixel6Api31BenchmarkAndroidTest
. - Sie müssen die generierten Baseline-Profilregeln manuell auf Ihren Code anwenden.
Generierte Regeln manuell anwenden
Der Generator für das Baseline-Profil erstellt eine HRF-Textdatei (Human Readable Format). und kopiert ihn auf Ihren Hostcomputer. So wenden Sie das generierte Profil an: zu Ihrem Code hinzufügen, gehen Sie so vor:
Suchen Sie die HRF-Datei im Build-Ordner des Moduls, das Sie generieren. Profil in:
[module]/build/outputs/managed_device_android_test_additional_output/[device]
Profile folgen den
[class name]-[test method name]-baseline-prof.txt
benannt hat, der wie folgt aussieht:BaselineProfileGenerator-startup-baseline-prof.txt
.Kopieren Sie das generierte Profil in
src/main/
und benennen Sie die Datei um inbaseline-prof.txt
.Abhängigkeit zur ProfileInstaller-Bibliothek hinzufügen in der
build.gradle.kts
-Datei deiner App, um das lokale Baseline-Profil zu aktivieren Kompilierung, bei der Cloud-Profile nicht verfügbar sind. Dies ist ist die einzige Möglichkeit, ein Baseline-Profil lokal zu übertragen.dependencies { implementation("androidx.profileinstaller:profileinstaller:1.3.1") }
Produktionsversion deiner App erstellen, während die angewendeten HRF-Regeln gelten in Binärform kompiliert und im APK oder AAB enthalten. Verteilen Sie dann wie gewohnt Ihre App aufrufen.
Benchmarking des Basisprofils
Erstellen Sie einen neuen Android-instrumentierten Testlauf, um Ihr Baseline-Profil zu vergleichen
Konfiguration aus der Gutteraktion, die die in
die Datei StartupBenchmarks.kt
oder StartupBencharks.java
. Weitere Informationen zu Benchmarks
siehe Makro-Benchmark erstellen
Kurs
und Messung mit MacroBenchmark automatisieren
Mediathek.
Wenn Sie dies in Android Studio ausführen, enthält die Build-Ausgabe Details zu die Geschwindigkeitsverbesserungen, die das Baseline-Profil bietet:
StartupBenchmarks_startupCompilationBaselineProfiles timeToInitialDisplayMs min 161.8, median 178.9, max 194.6 StartupBenchmarks_startupCompilationNone timeToInitialDisplayMs min 184.7, median 196.9, max 202.9
Alle erforderlichen Codepfade erfassen
Die zwei wichtigsten Messwerte zum Messen der App-Startzeiten sind:
- Zeit bis zur ersten Anzeige (TTID)
- Die Zeit, die benötigt wird, um den ersten Frame der App-UI anzuzeigen.
- Zeit bis zur vollständigen Anzeige (Time to Full Display, TTFD)
- TTID plus die Zeit für die Anzeige des Contents, der asynchron geladen wird, nachdem der erste Frame angezeigt wurde.
TTFD wird gemeldet, sobald
reportFullyDrawn()
der Methode
ComponentActivity
aufgerufen wird. Wenn reportFullyDrawn()
nie aufgerufen wird, wird die TTID gemeldet.
. Möglicherweise müssen Sie den Aufruf von reportFullyDrawn()
erst nach dem folgenden Datum verzögern:
wenn das asynchrone Laden abgeschlossen ist. Enthält die Benutzeroberfläche beispielsweise eine dynamische
wie RecyclerView
oder lazy
Liste enthält, kann die Liste durch einen Hintergrund
Aufgabe, die abgeschlossen wird, nachdem die Liste zum ersten Mal gezeichnet wurde und folglich nach der Benutzeroberfläche
ist als vollständig gezeichnet markiert. In diesen Fällen wird Code, der ausgeführt wird, nachdem die Benutzeroberfläche
Der vollständig gezeichnete Zustand ist nicht im Basisprofil enthalten.
Um die Grundgesamtheit der Liste in Ihr Baseline-Profil aufzunehmen, rufen Sie die
FullyDrawnReporter
mit
getFullyDrawnReporter()
und fügen Sie einen Reporter
im App-Code hinzu. Lassen Sie den Reporter los, sobald
Hintergrundaufgabe das Ausfüllen der Liste beendet. FullyDrawnReporter
nicht
die Methode reportFullyDrawn()
aufrufen, bis alle Reporter freigegeben sind. Durch
enthält das Baseline-Profil die Codepfade, die zum Füllen der Liste erforderlich sind.
Dies ändert nichts am Verhalten der Anwendung für den Nutzer, aber die Baseline kann
Das Profil enthält alle erforderlichen Codepfade.
Wenn Ihre App Jetpack Compose verwendet, verwenden Sie die folgenden APIs, um vollständig gezeichneten Zustand anzeigen:
ReportDrawn
gibt an, dass die zusammensetzbare Funktion sofort für eine Interaktion bereit ist.ReportDrawnWhen
verwendet ein Prädikat wielist.count > 0
, um anzugeben, wann Ihr zusammensetzbaren Funktionen zur Interaktion bereit.ReportDrawnAfter
verwendet eine Unterbrechungsmethode, die nach Abschluss des Vorgangs anzeigt, zusammensetzbaren Funktionen zur Interaktion bereit.
Empfehlungen für dich
- Hinweis: Der Linktext wird angezeigt, wenn JavaScript deaktiviert ist.
- MakroBenchmark-Messwerte erfassen
- Makro-Benchmark schreiben
- JankStats-Bibliothek