Mit der Jetpack Macrobenchmark-Bibliothek und BaselineProfileRule
können Sie automatisch Profile für jede App-Version erstellen. Wir empfehlen, com.android.tools.build:gradle:8.0.0
oder höher zu verwenden, da diese Version Verbesserungen beim Erstellen von Baseline-Profilen bietet.
So erstellen Sie ein neues Baseline-Profil:
- Modul „Baseline Profile“ einrichten
- Definieren Sie den JUnit-Test, mit dem Baseline-Profile generiert werden.
- Fügen Sie die kritischen User Journeys (CUJs) hinzu, die Sie optimieren möchten.
- Erstellen Sie das Baseline-Profil.
Nachdem Sie das Baseline-Profil generiert haben, führen Sie Benchmarks auf einem physischen Gerät durch, um die Geschwindigkeitsverbesserungen zu messen.
Neues Baseline-Profil mit AGP 8.2 oder höher erstellen
Am einfachsten erstellen Sie ein neues Baseline Profile mit der Modulvorlage „Baseline Profile“, die ab Android Studio Iguana und Android Gradle-Plug-in (AGP) 8.2 verfügbar ist.
Die Modulvorlage „Android Studio Baseline Profile Generator“ 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 Profile-Generierung und des Bestätigungscodes generiert. Die Vorlage erstellt Code zum Generieren und Benchmarking von Baseline-Profilen, um den App-Start zu messen.
Modul „Baseline Profile“ einrichten
So führen Sie die Modulvorlage für das Baseline-Profil aus:
- Wählen Sie Datei > Neu > Neues Modul aus.
- Wählen Sie im Bereich Vorlagen die Vorlage Baseline Profile Generator aus und konfigurieren Sie sie:
Abbildung 1. Modulvorlage für Baseline Profile Generator. Die Felder in der Vorlage sind:
- Zielanwendung: Gibt an, für welche App das Baseline-Profil generiert wird. Wenn Sie nur ein App-Modul in Ihrem Projekt haben, ist nur ein Element in dieser Liste enthalten.
- Modulname: Der Name, den Sie für das Baseline Profile-Modul verwenden möchten, das erstellt wird.
- Paketname: Der Paketname, den Sie für das Baseline Profile-Modul verwenden möchten.
- Sprache: Gibt an, ob der generierte Code in Kotlin oder Java erstellt werden soll.
- Build configuration language (Sprache für die Build-Konfiguration): 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 Fertigstellen. Das neue Modul wird erstellt. Wenn Sie die Versionsverwaltung verwenden, werden Sie möglicherweise aufgefordert, die neu erstellten Moduldateien hinzuzufügen.
Generator für Baseline-Profile 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 um CUJs und erweiterte Start-Workflows zu ergänzen. Achten Sie darauf, dass alle Tests, die sich auf den App-Start beziehen, in einem rule
-Block mit includeInStartupProfile
auf true
festgelegt sind. Umgekehrt sollten alle Tests, die sich nicht auf den App-Start beziehen, nicht in einem Startup-Profil enthalten sein, um eine optimale Leistung zu erzielen. Mithilfe von Optimierungen für den App-Start wird ein spezieller Teil eines Baseline-Profils definiert, der als Startprofil bezeichnet wird.
Es ist einfacher, den Code zu warten, wenn Sie diese CUJs außerhalb des generierten Baseline-Profils und Benchmark-Codes abstrahieren, sodass sie für beide verwendet werden können. Das bedeutet, dass Änderungen an Ihren CUJs einheitlich verwendet werden.
Baseline-Profil generieren und installieren
Mit der Modulvorlage für das Baseline-Profil wird eine neue Ausführungskonfiguration zum Generieren des Baseline-Profils hinzugefügt. Wenn Sie Produktvarianten verwenden, erstellt Android Studio mehrere Ausführungskonfigurationen, damit Sie für jede Variante separate Baseline-Profile generieren können.

Wenn die Ausführungskonfiguration Generate Baseline Profile abgeschlossen ist, wird das generierte Baseline Profile in die Datei src/variant/generated/baselineProfiles/baseline-prof.txt
im zu profilierenden Modul kopiert. Die Variantenoptionen sind entweder der Release-Build-Typ oder eine Build-Variante, die den Release-Build-Typ umfasst.
Das generierte Baseline-Profil wird ursprünglich in build/outputs
erstellt. Der vollständige Pfad hängt von der Variante oder Version der zu profilierenden App und davon ab, ob Sie ein von Gradle verwaltetes Gerät oder ein verbundenes Gerät für die Profilerstellung verwenden. Wenn Sie die Namen verwenden, die vom Code und den Build-Konfigurationen verwendet werden, die von der Vorlage generiert werden, wird das Baseline-Profil in der Datei build/outputs/managed_device_android_test_additional_output/nonminifiedrelease/pixel6Api31/BaselineProfileGenerator_generate-baseline-prof.txt
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 Makrobenchmarks und das Baseline Profile Gradle-Plug-in, 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 Macrobenchmark-Modulvorlage und dem Baseline-Profil-Gradle-Plug-in:
- Macrobenchmark-Modul in Ihrem Gradle-Projekt einrichten
- 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 einem
Activity
. Weitere Beispiele für Tests, bei denen@BaselineProfileRule
verwendet wird, um kritische User Journeys zu verbessern. Fügen Sie das Baseline Profile Gradle-Plug-in (
libs.plugins.androidx.baselineprofile
) hinzu. Das Plug-in erleichtert das Generieren und Verwalten von Baseline-Profilen.Führen Sie zum Generieren des Baseline-Profils die Gradle-Aufgaben
:app:generateBaselineProfile
oder:app:generateVariantBaselineProfile
im Terminal aus.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
aosp
alssystemImageSource
fest, da Sie für den Baseline Profile-Generator Root-Zugriff benötigen.Am Ende des Generierungsvorgangs wird das Baseline-Profil in
app/src/variant/generated/baselineProfiles
kopiert.
Neues Baseline-Profil ohne Vorlagen erstellen
Wir empfehlen, ein Baseline Profile mit der Modulvorlage für Baseline Profiles (bevorzugt) oder der Macrobenchmark-Vorlage von Android Studio zu erstellen. Sie können aber auch das Gradle-Plug-in für Baseline Profiles verwenden. Weitere Informationen zum Baseline Profile Gradle-Plug-in finden Sie unter Generierung von Baseline-Profilen konfigurieren.
So erstellen Sie ein Baseline-Profil direkt mit dem Baseline Profile Gradle-Plug-in:
- Erstellen Sie ein neues
com.android.test
-Modul, z. B.:baseline-profile
. Konfigurieren Sie die Datei
build.gradle.kts
für:baseline-profile
:- Wenden Sie das
androidx.baselineprofile
-Plug-in an. - Achten Sie darauf, dass
targetProjectPath
auf das Modul:app
verweist. - Optional können Sie ein von Gradle verwaltetes Gerät hinzufügen.
Im folgenden Beispiel ist es
pixel6Api31
. Wenn keine Angabe erfolgt, 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 Profile-Test im Testmodul
:baseline-profile
. Im folgenden Beispiel wird die App gestartet und auf den Leerlauf gewartet.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 App-Modul, 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")) }
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 Gradle-Aufgaben
:app:generateBaselineProfile
oder:app:generateVariantBaselineProfile
ausführen.Am Ende des Generierungsvorgangs wird das Baseline-Profil in
app/src/variant/generated/baselineProfiles
kopiert.
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 seine neuesten Funktionen verwenden können.
Wenn Sie Baseline-Profile mit AGP 7.3 bis 7.4 erstellen müssen, sind die Schritte dieselben wie die Schritte für AGP 8.1, mit den folgenden Ausnahmen:
- Fügen Sie das Baseline Profile Gradle-Plug-in nicht hinzu.
- Führen Sie den Gradle-Task
./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 Baseline Profile-Generator erstellt eine HRF-Textdatei (Human Readable Format) 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 Namensmuster
[class name]-[test method name]-baseline-prof.txt
, das so aussieht:BaselineProfileGenerator-startup-baseline-prof.txt
.Kopieren Sie das generierte Profil nach
src/main/
und benennen Sie die Datei inbaseline-prof.txt
um.Fügen Sie der
build.gradle.kts
-Datei Ihrer App eine Abhängigkeit von der ProfileInstaller-Bibliothek hinzu, um die lokale Kompilierung von Baseline-Profilen zu ermöglichen, wenn Cloud-Profile nicht verfügbar sind. Dies ist die einzige Möglichkeit, ein Baseline-Profil lokal zu sideloaden.dependencies { implementation("androidx.profileinstaller:profileinstaller:1.4.1") }
Erstellen Sie die Produktionsversion Ihrer App. Die angewendeten HRF-Regeln werden in binärer Form kompiliert und in das APK oder AAB aufgenommen. Verteilen Sie Ihre App dann wie gewohnt.
Baseline-Profil benchmarken
Um Ihr Baseline-Profil zu testen, erstellen Sie über die Gutter-Aktion eine neue Konfiguration für den instrumentierten Android-Testlauf, mit der die in der Datei StartupBenchmarks.kt
oder StartupBencharks.java
definierten Benchmarks ausgeführt werden. Weitere Informationen zu Benchmarktests finden Sie unter Macrobenchmark-Klasse erstellen und Messungen mit der Macrobenchmark-Bibliothek automatisieren.

Wenn Sie diesen Befehl 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 Startzeit von Apps sind:
- Zeit bis zur ersten Anzeige (Time to Initial Display, TTID)
- Die Zeit, die benötigt wird, um den ersten Frame der Benutzeroberfläche der Anwendung anzuzeigen.
- Zeit bis zur vollständigen Anzeige (TTFD)
- TTID plus die Zeit, die benötigt wird, um Inhalte zu rendern, die asynchron geladen werden, nachdem der erste Frame angezeigt wurde.
TTFD wird gemeldet, sobald die Methode reportFullyDrawn()
von 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 das asynchrone Laden abgeschlossen ist. Wenn die Benutzeroberfläche beispielsweise eine dynamische Liste wie eine RecyclerView
oder eine Lazy List enthält, wird die Liste möglicherweise durch eine Hintergrundaufgabe gefüllt, die nach dem ersten Rendern der Liste und damit nach dem Markieren der Benutzeroberfläche als vollständig gerendert abgeschlossen wird. In solchen Fällen wird Code, der ausgeführt wird, nachdem die Benutzeroberfläche vollständig gerendert wurde, nicht in das Baseline-Profil aufgenommen.
Wenn Sie das Ausfüllen der Liste in Ihr Baseline-Profil aufnehmen möchten, rufen Sie die FullyDrawnReporter
mit getFullyDrawnReporter()
ab und fügen Sie in Ihrem App-Code einen Reporter hinzu. Geben Sie den Reporter frei, sobald die Liste durch den Hintergrundtask gefüllt wurde. Die FullyDrawnReporter
ruft die Methode reportFullyDrawn()
erst auf, wenn alle Reporter freigegeben wurden. Dadurch 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, können Sie mit den folgenden APIs angeben, dass der Zeichenvorgang abgeschlossen ist:
ReportDrawn
gibt an, dass das Composable-Element sofort für die Interaktion bereit ist.ReportDrawnWhen
akzeptiert ein Prädikat wielist.count > 0
, um anzugeben, wann Ihre Composable für die Interaktion bereit ist.ReportDrawnAfter
akzeptiert eine suspend-Methode, die nach Abschluss angibt, dass Ihr Composable für die Interaktion bereit ist.
Empfehlungen für dich
- Hinweis: Linktext wird angezeigt, wenn JavaScript deaktiviert ist.
- Makrobenchmark-Messwerte erfassen
- Makro-Benchmark schreiben
- JankStats-Bibliothek