Mit der Jetpack
Macrobenchmark-Bibliothek und
BaselineProfileRule können Sie automatisch Profile für jede App-Version erstellen. Wir empfehlen die Verwendung von
com.android.tools.build:gradle:8.0.0 oder höher, da diese Versionen Verbesserungen für den Build
bieten, wenn Sie Baseline-Profile verwenden.
So erstellen Sie ein neues Baseline-Profil:
- Richten Sie das Baseline-Profilmodul ein.
- Definieren Sie den JUnit-Test, mit dem Baseline-Profile generiert werden.
- Fügen Sie die kritischen Nutzerpfade hinzu, die Sie optimieren möchten.
- Generieren Sie das Baseline-Profil.
Nachdem Sie das Baseline-Profil generiert haben, führen Sie einen Benchmark-Test auf einem physischen Gerät durch, um die Geschwindigkeitsverbesserungen zu messen.
Neues Baseline-Profil mit AGP 8.2 oder höher erstellen
Die einfachste Möglichkeit, ein neues Baseline-Profil zu erstellen, ist die Verwendung der Modulvorlage für Baseline-Profile , die ab Android Studio Iguana und Android Gradle Plugin (AGP) 8.2 verfügbar ist.
Die Modulvorlage für den Baseline-Profilgenerator von Android Studio automatisiert die Erstellung eines neuen Moduls zum Generieren und Benchmarking von Baseline-Profilen. Wenn Sie die Vorlage ausführen, wird der Großteil der typischen Build Konfiguration, der Baseline-Profilgenerierung und des Bestätigungscodes generiert. Die Vorlage erstellt Code zum Generieren und Benchmarking von Baseline-Profilen, um den App Start zu messen.
Baseline-Profilmodul einrichten
So führen Sie die Modulvorlage für Baseline-Profile aus:
- Wählen Sie Datei > Neu > Neues Modul aus.
- Wählen Sie im
Vorlagen Steuerfeld die Vorlage Baseline-Profilgenerator aus und konfigurieren Sie sie:
Abbildung 1 Modulvorlage für den Baseline-Profilgenerator Die Felder in der Vorlage sind:
- Zielanwendung: Definiert, für welche App das Baseline-Profil generiert wird. Wenn Ihr Projekt nur ein einziges App-Modul enthält, ist in dieser Liste nur ein Element vorhanden.
- Modulname: Der Name, den Sie für das zu erstellende Baseline-Profilmodul verwenden möchten.
- Paketname: Der Paketname, den Sie für das Baseline-Profil Modul verwenden möchten.
- Sprache: Gibt an, ob der generierte Code in Kotlin oder Java sein soll.
- Build-Konfigurationssprache: Gibt an, ob Sie Kotlin Script (KTS) oder Groovy für Ihre Build-Konfigurationsskripts verwenden möchten.
- Von Gradle verwaltetes Gerät verwenden: Gibt an, ob Sie von Gradle verwaltete Geräte zum Testen Ihrer App verwenden.
- Klicken Sie auf Fertig . Das neue Modul wird erstellt. Wenn Sie die Quellcodeverwaltung verwenden, werden Sie möglicherweise aufgefordert, die neu erstellten Moduldateien der Quellcodeverwaltung hinzuzufügen.
Baseline-Profilgenerator definieren
Das neu erstellte Modul enthält Tests zum Generieren und Benchmarking des
Baseline-Profils sowie zum Testen des grundlegenden App-Starts. Wir empfehlen, diese Tests um kritische Nutzerpfade und erweiterte Start-Workflows zu ergänzen. Alle Tests
im Zusammenhang mit dem App-Start müssen sich in einem rule-Block befinden, wobei includeInStartupProfile auf true gesetzt
sein muss. Umgekehrt sollten alle Tests, die nicht
mit dem App-Start zusammenhängen, nicht in einem Startprofil enthalten sein, um eine optimale Leistung zu erzielen. Mit App-Start
optimierungen wird ein spezieller Teil eines Baseline-Profils definiert, der als
Startprofil bezeichnet wird.
Es ist einfacher, diese kritischen Nutzerpfade außerhalb des generierten Baseline-Profils und Benchmark-Codes zu abstrahieren, damit sie für beides verwendet werden können. So werden Änderungen an Ihren kritischen Nutzerpfaden einheitlich verwendet.
Baseline-Profil generieren und installieren
Die Modulvorlage für Baseline-Profile fügt eine neue Ausführungskonfiguration hinzu, um das Baseline-Profil zu generieren. Wenn Sie Produktvarianten verwenden, erstellt Android Studio mehrere Ausführungskonfigurationen, damit Sie separate Baseline-Profile für jede Variante generieren können.
Nach Abschluss der Ausführungskonfiguration Baseline-Profil generieren wird
das generierte Baseline-Profil in die
src/variant/generated/baselineProfiles/baseline-prof.txt
Datei im Modul kopiert, für das das Profil erstellt wird. Die Variantenoptionen sind entweder der
Release-Build-Typ oder eine Build-Variante, die den Release-Build-Typ enthält.
Das generierte Baseline-Profil wird ursprünglich in build/outputs erstellt. Der
vollständige Pfad wird durch die Variante oder Produktvariante der App bestimmt, für die das Profil erstellt wird, und
davon, ob Sie ein von Gradle verwaltetes Gerät oder ein verbundenes Gerät für die Profilerstellung verwenden. Wenn
Sie die Namen verwenden, die von den durch die
Vorlage generierten Code- und Build-Konfigurationen verwendet werden, wird das Baseline-Profil in der
build/outputs/managed_device_android_test_additional_output/nonminifiedrelease/pixel6Api31/BaselineProfileGenerator_generate-baseline-prof.txt Datei erstellt. Sie müssen wahrscheinlich nicht
direkt mit dieser Version des generierten Baseline-Profils interagieren
es sei denn, Sie kopieren es manuell in die Zielmodule (nicht empfohlen).
Neues Baseline-Profil mit AGP 8.1 erstellen
Wenn Sie die Modulvorlage für Baseline-Profile nicht verwenden können, verwenden Sie die Modulvorlage für Macrobenchmark und das Gradle-Plug-in für Baseline-Profile, um ein neues Baseline-Profil zu erstellen. Wir empfehlen, diese Tools ab Android Studio Giraffe und AGP 8.1 zu verwenden.
So erstellen Sie ein neues Baseline-Profil mit der Modulvorlage für Macrobenchmark und dem Gradle-Plug-in für Baseline-Profile:
- Richten Sie ein Macrobenchmark-Modul in Ihrem Gradle-Projekt ein.
- 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 enthalten, die über den App-Start hinausgehen. So können Sie die Laufzeitleistung Ihrer App optimieren, z. B. beim Scrollen von Listen, Ausführen von Animationen und Navigieren in einer
Activity. Weitere Beispiele für Tests, die@BaselineProfileRuleverwenden, um kritische Nutzerpfade zu verbessern Fügen Sie das Gradle-Plug-in für Baseline-Profile (
libs.plugins.androidx.baselineprofile) hinzu. Das Plug-in erleichtert das Generieren und Verwalten von Baseline-Profilen.Wenn Sie das Baseline-Profil generieren möchten, führen Sie im Terminal die Gradle-Aufgaben
:app:generateBaselineProfileoder:app:generateVariantBaselineProfileaus.Führen Sie den Generator als instrumentierten Test auf einem gerooteten physischen Gerät, Emulator oder von Gradle verwalteten Gerät aus. Wenn Sie ein von Gradle verwaltetes Gerät verwenden, legen Sie
aospalssystemImageSourcefest, da Sie für den Baseline-Profilgenerator Root Zugriff benötigen.Am Ende der Generierungsaufgabe wird das Baseline-Profil nach
app/src/variant/generated/baselineProfileskopiert.
Neues Baseline-Profil ohne Vorlagen erstellen
Wir empfehlen, ein Baseline-Profil mit der Modulvorlage für Baseline-Profile von Android Studio (bevorzugt) oder der Macrobenchmark-Vorlage zu erstellen. Sie können aber auch nur das Gradle-Plug-in für Baseline-Profile verwenden. Weitere Informationen zum Gradle-Plug-in für Baseline-Profile finden Sie unter Generierung von Baseline-Profilen konfigurieren.
So erstellen Sie ein Baseline-Profil direkt mit dem Gradle-Plug-in für Baseline-Profile:
- Erstellen Sie ein neues
com.android.test-Modul, z. B.:baseline-profile. Konfigurieren Sie die Datei
build.gradle.ktsfür:baseline-profile:- Wenden Sie das
androidx.baselineprofilePlug-in an. - Achten Sie darauf, dass das
targetProjectPathauf das:appModul verweist. - Optional können Sie ein
von Gradle verwaltetes Gerät hinzufügen.
Im folgenden Beispiel ist es
pixel6Api31. Wenn nichts angegeben ist, verwendet das Plug-in ein verbundenes Gerät, entweder emuliert oder physisch. - Wenden Sie die gewünschte Konfiguration an, wie im folgenden Beispiel gezeigt.
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 }
Groovy
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
Erstellen Sie einen Baseline-Profiltest im
:baseline-profileTestmodul. Im folgenden Beispiel wird ein Test gezeigt, der ein Baseline-Profil für den App Start generiert.Kotlin
class BaselineProfileGenerator { @get:Rule val baselineProfileRule = BaselineProfileRule() @Test fun startup() = baselineProfileRule.collect( packageName = "com.example.app", profileBlock = { uiAutomator { startApp(PACKAGE_NAME) } } ) }
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.ktsim App-Modul, z. B.:app.- Wenden Sie das Plug-in
androidx.baselineprofilean. - Fügen Sie dem Modul
:baseline-profileeinebaselineProfile-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")) }
Groovy
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
Generieren Sie das Profil, indem Sie die
:app:generateBaselineProfileoder:app:generateVariantBaselineProfileGradle-Aufgaben ausführen.Am Ende der Generierungsaufgabe wird das Baseline-Profil nach
app/src/variant/generated/baselineProfileskopiert.
Neues Baseline-Profil mit AGP 7.3–7.4 erstellen
Es ist möglich, Baseline-Profile mit AGP 7.3–7.4 zu generieren. Wir empfehlen jedoch dringend, mindestens auf AGP 8.1 zu aktualisieren, damit Sie das Gradle-Plug-in für Baseline-Profile und die neuesten Funktionen verwenden können.
Wenn Sie Baseline-Profile mit AGP 7.3–7.4 erstellen müssen, sind die Schritte dieselben wie die Schritte für AGP 8.1, mit folgenden 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]AndroidTestaus, 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 Baseline-Profilgenerator erstellt eine Textdatei im für Menschen lesbaren Format (Human Readable Format, HRF) auf dem Gerät und kopiert sie auf Ihren Hostcomputer. So wenden Sie das generierte Profil auf Ihren Code an:
Suchen Sie die HRF-Datei im Build-Ordner des Moduls, in dem Sie das Profil generieren:
[module]/build/outputs/managed_device_android_test_additional_output/[device].Profile folgen dem
[class name]-[test method name]-baseline-prof.txtBenennungsmuster, das so aussieht:BaselineProfileGenerator-startup-baseline-prof.txt.Kopieren Sie das generierte Profil nach
src/main/und benennen Sie die Datei inbaseline-prof.txtum.Fügen Sie der Datei
build.gradle.ktsIhrer App eine Abhängigkeit zur ProfileInstaller-Bibliothek hinzu, um die lokale Kompilierung von Baseline-Profilen zu ermöglichen, wenn keine Cloud-Profile verfügbar sind. Dies ist die einzige Möglichkeit, ein Baseline-Profil lokal zu laden.dependencies { implementation("androidx.profileinstaller:profileinstaller:1.4.1") }Erstellen Sie die Produktionsversion Ihrer App, während die angewendeten HRF-Regeln in Binärform kompiliert und in das APK oder AAB aufgenommen werden. Verteilen Sie Ihre App dann wie gewohnt.
Benchmark-Test für das Baseline-Profil durchführen
Wenn Sie einen Benchmark-Test für Ihr Baseline-Profil durchführen möchten, erstellen Sie eine neue Android Instrumented Test Run
Konfiguration über die Gutter-Aktion, die die in
der StartupBenchmarks.kt oder StartupBencharks.java Datei definierten Benchmark-Tests ausführt. Weitere Informationen zu Benchmark
Tests finden Sie unter Macrobenchmark
Klasse erstellen
und Messungen mit der Macrobenchmark
Bibliothek automatisieren.
Wenn Sie dies in Android Studio ausführen, enthält die Build-Ausgabe Details zu den 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 beiden wichtigsten Messwerte für die Messung der App-Startzeiten sind:
- Zeit bis zur ersten Anzeige (Time to initial display, TTID)
- Die Zeit, die benötigt wird, um den ersten Frame der Anwendungsoberfläche anzuzeigen.
- Zeit bis zur vollständigen Anzeige (Time to full display, TTFD)
- TTID plus die Zeit, die benötigt wird, um Inhalte anzuzeigen, die nach der Anzeige des ersten Frames asynchron geladen werden.
TTFD wird gemeldet, sobald die
reportFullyDrawn()
Methode von der
ComponentActivity
aufgerufen wird. Wenn reportFullyDrawn() nie aufgerufen wird, wird stattdessen die TTID gemeldet. Möglicherweise müssen Sie den Aufruf von reportFullyDrawn() verzögern, bis nach
dem asynchronen Laden abgeschlossen ist. Wenn die Benutzeroberfläche beispielsweise eine dynamische
Liste wie eine RecyclerView oder eine Lazy
Liste enthält, wird die Liste möglicherweise durch eine Hintergrund
Aufgabe gefüllt, die abgeschlossen wird, nachdem die Liste zum ersten Mal gezeichnet wurde und somit nachdem die Benutzeroberfläche
als vollständig gezeichnet markiert wurde. In solchen Fällen ist Code, der ausgeführt wird, nachdem die Benutzeroberfläche den Status
„Vollständig gezeichnet“ erreicht hat, nicht im Baseline-Profil enthalten.
Wenn Sie die Listenerstellung in Ihr Baseline-Profil aufnehmen möchten, rufen Sie
FullyDrawnReporter mit
getFullyDrawnReporter()
ab und fügen Sie in Ihrem App-Code einen Reporter hinzu. Geben Sie den Reporter frei, sobald die
Hintergrundaufgabe die Liste gefüllt hat. Die FullyDrawnReporter ruft die reportFullyDrawn() Methode erst auf, wenn alle Reporter freigegeben wurden. So enthält das Baseline-Profil die Codepfade, die zum Füllen der Liste erforderlich sind.
Das Verhalten der App für den Nutzer ändert sich dadurch nicht, aber das Baseline
Profil enthält alle erforderlichen Codepfade.
Wenn Ihre App Jetpack Compose verwendet, verwenden Sie die folgenden APIs, um den Status „Vollständig gezeichnet“ anzugeben:
ReportDrawngibt an, dass Ihre zusammensetzbare Funktion sofort zur Interaktion bereit ist.ReportDrawnWhenverwendet ein Prädikat wielist.count > 0, um anzugeben, wann Ihre zusammensetzbare Funktion zur Interaktion bereit ist.ReportDrawnAfterverwendet eine suspendierende Methode, die angibt, dass Ihre zusammensetzbare Funktion zur Interaktion bereit ist, wenn sie abgeschlossen ist.
Empfehlungen für Sie
- Hinweis: Linktext wird angezeigt, wenn JavaScript deaktiviert ist
- Macrobenchmark-Messwerte erfassen
- Macrobenchmark schreiben
- JankStats-Bibliothek