Basisprofile erstellen

Generieren Sie mit der Jetpack-MacroBenchmark-Bibliothek und BaselineProfileRule automatisch Profile für jeden Anwendungsrelease. Wir empfehlen die Verwendung von com.android.tools.build:gradle:8.0.0 oder höher, da diese bei der Verwendung von Baseline-Profilen Build-Verbesserungen einbringt.

Dies sind die allgemeinen Schritte zum Erstellen eines neuen Baseline-Profils:

  1. Richten Sie das Modul „Baseline Profile“ ein.
  2. Definieren Sie den JUnit-Test, mit dem Baseline-Profile erstellt werden können.
  3. Fügen Sie die kritischen User Journeys (CUJs) hinzu, die Sie optimieren möchten.
  4. Generieren Sie das Baseline-Profil.

Führen Sie nach dem Generieren des Baseline-Profils ein Benchmarking mit einem physischen Gerät durch, um die Geschwindigkeitsverbesserungen zu messen.

Erstellen Sie ein neues Baseline-Profil mit AGP 8.2 oder höher.

Am einfachsten erstellen Sie ein neues Baseline-Profil mit der Modulvorlage „Baseline Profile“, die ab Android Studio Iguana und dem Android Gradle Plugin (AGP) 8.2 verfügbar ist.

Mit der Modulvorlage des Android Studio Baseline Profile Generators wird das Erstellen eines neuen Moduls automatisiert, um Baseline-Profile zu generieren und zu vergleichen. Durch das Ausführen der Vorlage werden die meisten der typischen Build-Konfigurationen, der Generierung des Baseline-Profils und des Bestätigungscodes generiert. Die Vorlage erstellt Code zum Generieren und Benchmarken von Referenzprofilen zum Messen des Anwendungsstarts.

Modul „Baseline Profile“ einrichten

Führen Sie die folgenden Schritte aus, um die Modulvorlage „Baseline Profile“ auszuführen:

  1. Wählen Sie File > New > New Module aus.
  2. Wählen Sie im Bereich Vorlagen die Vorlage Baseline Profile Generator aus und konfigurieren Sie sie:
    Abbildung 1: Modulvorlage „Baseline Profile Generator“.

    Die Vorlage enthält folgende Felder:

    • Zielanwendung: definiert, für welche Anwendung das Baseline-Profil generiert wird. Wenn Ihr Projekt nur ein einzelnes App-Modul enthält, enthält diese Liste nur ein Element.
    • Modulname: der Name, den Sie für das zu erstellende Modul des Baseline-Profils verwenden möchten.
    • Paketname: der Paketname, den Sie für das Modul "Baseline Profile" verwenden möchten.
    • Sprache: Gibt an, ob der generierte Code Kotlin oder Java sein soll.
    • Build-Konfigurationssprache: Geben Sie 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 zum Testen Ihrer App Gradle-verwaltete Geräte verwenden.
  3. Klicken Sie auf Finish (Fertigstellen) und das neue Modul wird erstellt. Wenn Sie die Versionsverwaltung verwenden, werden Sie möglicherweise aufgefordert, die neu erstellten Moduldateien der Versionsverwaltung hinzuzufügen.

Baseline-Profilgenerator definieren

Das neu erstellte Modul enthält Tests, um das Baseline-Profil zu generieren und zu vergleichen und nur den einfachen Anwendungsstart zu testen. Wir empfehlen Ihnen, diese um CUJs und erweiterte Start-Workflows zu erweitern. Achten Sie darauf, dass sich alle Tests, die sich auf den Anwendungsstart beziehen, in einem rule-Block befinden, bei dem includeInStartupProfile auf true festgelegt ist. Um eine optimale Leistung zu erzielen, sollten Sie umgekehrt alle Tests, die sich nicht auf den Anwendungsstart beziehen, nicht in einem Startprofil enthalten sind. Mithilfe von Optimierungen beim Start von Apps wird ein spezieller Teil eines Baseline-Profils definiert, ein sogenanntes Startprofil.

Die Verwaltbarkeit ist einfacher, wenn Sie diese CUJs außerhalb des generierten Baseline-Profils und des Benchmark-Codes abstrahieren, damit sie für beide verwendet werden können. Dies bedeutet, dass Änderungen an Ihren CUJs konsistent verwendet werden.

Baseline-Profil generieren und installieren

Die Modulvorlage „Baseline Profile“ fügt eine neue Ausführungskonfiguration zum Generieren des Baseline-Profils hinzu. Wenn Sie Produktvarianten verwenden, erstellt Android Studio mehrere Ausführungskonfigurationen, sodass Sie separate Referenzprofile für jede Geschmacksrichtung generieren können.

Die Ausführungskonfiguration für das Generieren des Referenzprofils.
Abbildung 2: Durch das Ausführen dieser Konfiguration wird das Referenzprofil generiert.

Wenn die Ausführungskonfiguration Generate Baseline Profile (Referenzprofil generieren) abgeschlossen ist, wird das generierte Referenzprofil in die Datei src/variant/generated/baselineProfiles/baseline-prof.txt des Moduls kopiert, für das ein Profil erstellt wird. Die Variantenoptionen sind entweder der Release-Build-Typ oder eine Build-Variante mit diesem Typ.

Das generierte Referenzprofil wurde ursprünglich in build/outputs erstellt. Der vollständige Pfad wird durch die Variante oder den Geschmack der Anwendung bestimmt, für die ein Profil erstellt wird und ob Sie ein von Gradle verwaltetes Gerät oder ein verbundenes Gerät für die Profilerstellung verwenden. Wenn Sie die vom Code verwendeten Namen und Build-Konfigurationen verwenden, die von der Vorlage generiert wurden, wird das Referenzprofil 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 Referenzprofils interagieren, es sei denn, Sie kopieren sie manuell in die Zielmodule (nicht empfohlen).

Neues Baseline-Profil mit AGP 8.1 erstellen

Wenn Sie die Modulvorlage „Baseline Profile“ nicht verwenden können, verwenden Sie die MacroBenchmark-Modulvorlage 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.

Im Folgenden wird beschrieben, wie Sie mit der MacroBenchmark-Modulvorlage und dem Baseline Profile Gradle-Plug-in ein neues Baseline-Profil erstellen:

  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 über den App-Start hinaus enthalten. So kannst du die Laufzeitleistung deiner App optimieren, z. B. Listen zum Scrollen, Ausführen von Animationen und das Navigieren innerhalb eines Activity-Objekts. Hier findest du weitere Beispiele für Tests, bei denen mithilfe von @BaselineProfileRule kritische Nutzerpfade verbessert werden.

  3. Fügen Sie das Gradle-Plug-in "Baseline Profile" (libs.plugins.androidx.baselineprofile) hinzu. Mit dem Plug-in können Sie Baseline-Profile einfacher generieren und in Zukunft verwalten.

  4. Führen Sie die Gradle-Tasks :app:generateBaselineProfile oder :app:generateVariantBaselineProfile im Terminal aus, um das Baseline-Profil zu generieren.

    Führen Sie den Generator als instrumentierten Test auf einem gerooteten physischen Gerät, einem Emulator oder einem von Gradle verwalteten Gerät aus. Wenn Sie ein von Gradle verwaltetes Gerät verwenden, legen Sie aosp als systemImageSource fest, da Sie Root-Zugriff für den Baseline-Profilgenerator benötigen.

    Am Ende der Generierungsaufgabe wird das Referenzprofil nach app/src/variant/generated/baselineProfiles kopiert.

Neues Baseline-Profil ohne Vorlagen erstellen

Wir empfehlen, ein Baseline-Profil mit der Modulvorlage von Android Studio (bevorzugt) oder der MacroBenchmark-Vorlage zu erstellen. Sie können aber auch das Gradle-Plug-in "Baseline Profile" allein verwenden. Weitere Informationen zum Gradle-Plug-in „Baseline Profile“ finden Sie unter Baseline-Profilerstellung konfigurieren.

So erstellen Sie direkt ein Baseline-Profil mit dem Gradle-Plug-in „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 targetProjectPath auf das Modul :app verweist.
    3. Fügen Sie optional ein Gradle-verwaltetes Gerät (GMD) hinzu. Im folgenden Beispiel ist das pixel6Api31. Wenn nicht angegeben, 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
    }
    

    Groovig

    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 im Testmodul :baseline-profile einen Baseline-Profiltest. Das folgende Beispiel ist ein Test, bei dem die Anwendung gestartet und auf Inaktivität gewartet wird.

    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;
                })
            )
        }
    }
    
  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"))
    }
    

    Groovig

    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 Gradle-Tasks :app:generateBaselineProfile oder :app:generateVariantBaselineProfile ausführen.

  6. Am Ende der Generierungsaufgabe wird das Referenzprofil nach app/src/variant/generated/baselineProfiles kopiert.

Erstellen Sie ein neues Baseline-Profil mit AGP 7.3-7.4

Es ist möglich, Baseline-Profile mit AGP 7.3–7.4 zu erstellen. Wir empfehlen jedoch dringend ein Upgrade auf mindestens AGP 8.1, damit Sie das Gradle-Plug-in „Baseline Profile“ und seine neuesten Funktionen verwenden können.

Wenn Sie Referenzprofile mit AGP 7.3–7.4 erstellen müssen, sind die Schritte mit den Schritten für AGP 8.1 identisch, bis auf folgende Ausnahmen:

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:

  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 ProfileInstaller-Bibliothek in der Datei build.gradle.kts Ihrer Anwendung eine Abhängigkeit hinzu, um die lokale Kompilierung des Referenzprofils zu aktivieren, wenn Cloud-Profile nicht verfügbar sind. Dies ist die einzige Möglichkeit, ein Baseline-Profil lokal per Sideload zu übertragen.

    dependencies {
         implementation("androidx.profileinstaller:profileinstaller:1.3.1")
    }
    
  4. Erstellen Sie die Produktionsversion Ihrer App, während die angewendeten HRF-Regeln in Binärform kompiliert und im APK oder AAB enthalten sind. Verteilen Sie Ihre App dann wie gewohnt.

Benchmark für das Baseline-Profil erstellen

Erstellen Sie zum Benchmarking Ihres Baseline-Profils eine neue Konfiguration für einen instrumentierten Android-Testlauf aus der Binnenaktion, die die in der Datei StartupBenchmarks.kt oder StartupBencharks.java definierten Benchmarks ausführt. Weitere Informationen zu Benchmarktests finden Sie unter MacroBenchmark-Klasse erstellen und Messung mit der MacroBenchmark-Bibliothek automatisieren.

Abbildung 3: Führen Sie Android-Tests über die Gutter-Aktion aus.

Wenn Sie den 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 zum Messen der App-Startzeiten sind:

Zeit bis zur ersten Anzeige (TTID)
Wie lange es dauert, bis der erste Frame der App-UI angezeigt wird.
Zeit bis zur vollständigen Anzeige (Time to Full Display, TTFD)
TTID plus der Anzeigedauer von Content, der asynchron geladen wird, nachdem der erste Frame angezeigt wurde.

TTFD wird gemeldet, sobald die Methode reportFullyDrawn() des ComponentActivity aufgerufen wird. Wenn reportFullyDrawn() nie aufgerufen wird, wird stattdessen die TTID gemeldet. Wenn reportFullyDrawn() aufgerufen wird, müssen Sie möglicherweise warten, bis das asynchrone Laden abgeschlossen ist. Wenn die UI beispielsweise eine dynamische Liste wie RecyclerView oder Lazy List enthält, wird die Liste möglicherweise mit einer Hintergrundaufgabe gefüllt, die abgeschlossen wird, nachdem die Liste erstmals gezeichnet wurde und somit als vollständig gezeichnet markiert wurde. In solchen Fällen ist Code, der ausgeführt wird, nachdem die Benutzeroberfläche den vollständig gezeichneten Zustand erreicht hat, nicht im Referenzprofil enthalten.

Wenn Sie die Listenpopulation in das Baseline-Profil aufnehmen möchten, rufen Sie mit getFullyDrawnReporter() den FullyDrawnReporter ab und fügen Sie einen Reporter in Ihren App-Code ein. Sobald die Hintergrundaufgabe mit dem Inhalt der Hintergrundaufgabe fertig ist, Die Methode FullyDrawnReporter ruft erst dann die Methode reportFullyDrawn() auf, wenn alle Melder freigegeben wurden. Dadurch enthält das Baseline-Profil die Codepfade, die zum Füllen der Liste erforderlich sind. Dadurch ändert sich das Anwendungsverhalten für den Nutzer nicht. Das Baseline-Profil kann jedoch alle erforderlichen Codepfade enthalten.

Wenn Ihre Anwendung Jetpack Compose verwendet, verwenden Sie die folgenden APIs, um den vollständig gezeichneten Zustand anzugeben:

  • ReportDrawn gibt an, dass die zusammensetzbare Funktion sofort einsatzbereit ist.
  • ReportDrawnWhen verwendet ein Prädikat wie list.count > 0, um anzugeben, wann die zusammensetzbare Funktion bereit für die Interaktion ist.
  • ReportDrawnAfter verwendet eine Sperrmethode, die nach Abschluss anzeigt, dass die zusammensetzbare Funktion zur Interaktion bereit ist.