Basisprofile erstellen

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:

  1. Richten Sie das Baseline-Profilmodul ein.
  2. Definieren Sie den JUnit-Test, der beim Generieren von Basisprofilen hilft.
  3. Fügen Sie die Critical User Journeys (CUJs) hinzu, die Sie optimieren möchten.
  4. 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:

  1. Wählen Sie Datei > Neu > Neues Modul
  2. Wählen Sie die Vorlage Baseline Profile Generator (Referenzprofilgenerator) im Menü Vorlagen und konfigurieren Sie ihn:
    Abbildung 1. Vorlage für das Modul „Baseline Profile Generator“

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

Die Ausführungskonfiguration zum Erstellen eines Referenzprofils.
Abbildung 2: Durch das Ausführen dieser Konfiguration wird die Baseline generiert Profil

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 mit MacroBenchmark Modulvorlage und Gradle-Plug-in für Baseline-Profile:

  1. <ph type="x-smartling-placeholder"> </ph> festlegen ein MacroBenchmark-Modul in Ihrem Gradle-Projekt erstellen.
  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 Start der App hinaus enthalten. So können Sie die Laufzeitleistung Ihrer App optimieren, z. B. zum Scrollen von Listen, zum Ausführen von Animationen und zum Navigieren in einem Activity Siehe weitere Beispiele für Tests, bei denen @BaselineProfileRule verwendet wird, um um kritische User Journeys zu verbessern.

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

  4. 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 aosp als systemImageSource 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:

  1. Erstellen Sie ein neues com.android.test-Modul. Beispiel: :baseline-profile.
  2. Datei build.gradle.kts konfigurieren für :baseline-profile:

    1. Wenden Sie das Plug-in androidx.baselineprofile an.
    2. Achten Sie darauf, dass targetProjectPath auf das Modul :app.
    3. 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.
    4. 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
    }
    
  3. 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;
                })
            )
        }
    }
    
  4. Aktualisieren Sie die Datei build.gradle.kts im Anwendungsmodul, 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"))
    }
    

    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"'
    }
    
  5. Profil durch Ausführen des :app:generateBaselineProfile erstellen oder :app:generateVariantBaselineProfile-Gradle-Aufgaben.

  6. 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:

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

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

  3. 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")
    }
    
  4. 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.

Abbildung 3: Android-Tests über den Bundter ausführen Aktion ausführen.

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 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 Ihre zusammensetzbare Funktion sofort für eine Interaktion bereit ist.
  • ReportDrawnWhen verwendet ein Prädikat wie list.count > 0, um anzuzeigen, wann Ihr zusammensetzbaren Funktionen zur Interaktion bereit.
  • ReportDrawnAfter verwendet eine Unterbrechungsmethode, die nach Abschluss des Vorgangs anzeigt, zusammensetzbaren Funktionen zur Interaktion bereit.