Basisprofile erstellen

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:

  1. Richten Sie das Baseline-Profilmodul ein.
  2. Definieren Sie den JUnit-Test, mit dem Baseline-Profile generiert werden.
  3. Fügen Sie die kritischen Nutzerpfade hinzu, die Sie optimieren möchten.
  4. 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:

  1. Wählen Sie Datei > Neu > Neues Modul aus.
  2. 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.
  3. 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.

Die Ausführungskonfiguration „Baseline-Profil generieren“.
Abbildung 2 Wenn Sie diese Konfiguration ausführen, wird das Baseline Profil generiert.

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:

  1. Richten Sie ein Macrobenchmark-Modul in Ihrem Gradle-Projekt ein.
  2. 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 @BaselineProfileRule verwenden, um kritische Nutzerpfade zu verbessern

  3. 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.

  4. Wenn Sie das Baseline-Profil generieren möchten, führen Sie im Terminal die Gradle-Aufgaben :app:generateBaselineProfile oder :app:generateVariantBaselineProfile 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 als systemImageSource fest, da Sie für den Baseline-Profilgenerator Root Zugriff benötigen.

    Am Ende der Generierungsaufgabe wird das Baseline-Profil nach app/src/variant/generated/baselineProfiles kopiert.

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:

  1. Erstellen Sie ein neues com.android.test-Modul, z. B. :baseline-profile.
  2. Konfigurieren Sie die Datei build.gradle.kts für :baseline-profile:

    1. Wenden Sie das androidx.baselineprofile Plug-in an.
    2. Achten Sie darauf, dass das targetProjectPath auf das :app Modul verweist.
    3. 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.
    4. 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
    }
  3. Erstellen Sie einen Baseline-Profiltest im :baseline-profile Testmodul. 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;
                })
            )
        }
    }
  4. Aktualisieren Sie die Datei build.gradle.kts im App-Modul, z. B. :app.

    1. Wenden Sie das Plug-in androidx.baselineprofile an.
    2. Fügen Sie dem Modul :baseline-profile eine baselineProfile-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'
    }
  5. Generieren Sie das Profil, indem Sie die :app:generateBaselineProfile oder :app:generateVariantBaselineProfile Gradle-Aufgaben ausführen.

  6. Am Ende der Generierungsaufgabe wird das Baseline-Profil nach 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 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]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-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:

  1. 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.txt Benennungsmuster, das so aussieht: BaselineProfileGenerator-startup-baseline-prof.txt.

  2. Kopieren Sie das generierte Profil nach src/main/ und benennen Sie die Datei in baseline-prof.txt um.

  3. Fügen Sie der Datei build.gradle.kts Ihrer 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")
    }
    
  4. 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.

Abbildung 3. Android-Tests über die Gutter Aktion ausführen.

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:

  • ReportDrawn gibt an, dass Ihre zusammensetzbare Funktion sofort zur Interaktion bereit ist.
  • ReportDrawnWhen verwendet ein Prädikat wie list.count > 0, um anzugeben, wann Ihre zusammensetzbare Funktion zur Interaktion bereit ist.
  • ReportDrawnAfter verwendet eine suspendierende Methode, die angibt, dass Ihre zusammensetzbare Funktion zur Interaktion bereit ist, wenn sie abgeschlossen ist.