Baseline-Profile – Übersicht

Referenzprofile verbessern die Geschwindigkeit der Codeausführung ab dem ersten Start um etwa 30 %, da Interpretationen und JIT-Kompilierungsschritte (Just-in-Time) für enthaltene Codepfade vermieden werden.

Wenn Sie ein Baseline-Profil in eine App oder Bibliothek senden, kann Android Runtime (ART) bestimmte Codepfade durch Ahead-of-Time-Kompilierung (AOT) optimieren und Leistungsverbesserungen für jeden neuen Nutzer und jedes App-Update bereitstellen. Mit dieser Profilgeführten Optimierung (PGO) können Anwendungen den Start optimieren, Interaktionsverzögerungen reduzieren und die Gesamtlaufzeitleistung für Nutzer vom ersten Start an verbessern.

Diese Leistungsverbesserungen führen direkt zu verbesserten Geschäftsmesswerten wie Nutzerbindung, Transaktionen und Bewertungen. Weitere Informationen dazu, wie sich die Leistung auf Geschäftsmesswerte auswirkt, finden Sie in Josh, Lyft, TikTok und Zomato.

Vorteile von Baseline-Profilen

Mit Referenzprofilen werden alle Nutzerinteraktionen ab der ersten Ausführung reibungsloser gestaltet, z. B. App-Start, Navigation zwischen Bildschirmen oder Scrollen durch Inhalte. Durch Erhöhen der Geschwindigkeit und Reaktionsfähigkeit einer App können Baseline-Profile zu mehr aktiven Nutzern pro Tag und einer höheren durchschnittlichen Rückkehrrate führen.

Referenzprofile unterstützen die Optimierung über den App-Start hinaus, da sie gängige Nutzerinteraktionen bieten, die die App-Laufzeit vom ersten Start an verbessern. Die geführte AOT-Kompilierung hängt nicht von Nutzergeräten ab und kann einmal pro Release auf einem Entwicklungscomputer statt auf einem Mobilgerät durchgeführt werden. Durch das Versenden von Releases mit einem Baseline-Profil sind Anwendungsoptimierungen viel schneller verfügbar, als wenn nur Cloud-Profile verwendet werden.

Wenn Sie kein Baseline-Profil verwenden, wird der gesamte Anwendungscode entweder nach der Interpretation im Arbeitsspeicher JIT-kompiliert oder im Hintergrund in eine odex-Datei geschrieben, wenn das Gerät inaktiv ist. Nach der Installation oder Aktualisierung einer App ist die Nutzerfreundlichkeit von der ersten Ausführung bis zur Optimierung neuer Codepfade für Nutzer nicht optimal. Viele Apps messen nach der Optimierung Leistungssteigerungen von etwa 30 %.

Start-up-Profile

Startprofile ähneln Baseline-Profilen, haben aber den Unterschied, dass sie bei der Kompilierung und nicht für die On-Device-Optimierung verwendet werden. Ein Startprofil wird verwendet, um das Layout der DEX-Datei zu optimieren und so die Startzeiten zu verkürzen. Der im Startprofil angegebene Code wird in die primäre Datei classes.dex und der andere Code in separate DEX-Dateien eingefügt. Dies verkürzt die Startzeiten, da die Anzahl der Seitenfehler beim Start der Anwendung reduziert wird. Weitere Informationen dazu, wie Startprofile und DEX-Layoutoptimierungen die Startzeiten von Anwendungen verbessern können, finden Sie unter DEX-Layoutoptimierungen und Startprofile.

Erste Schritte

Informationen zum Optimieren der Leistung in Ihrer vorhandenen Anwendung finden Sie unter Referenzprofile erstellen.

Die Abhängigkeitskette stellt stabile Release- und Entwicklungsversionen bereit. Verwenden Sie zum Generieren und Installieren eines Baseline-Profils die folgenden unterstützten Versionen des Android-Gradle-Plug-ins, der MacroBenchmark-Bibliothek und des Profile Installers oder höher. Diese Abhängigkeiten sind zu unterschiedlichen Zeiten erforderlich und arbeiten als Toolchain zusammen, um ein optimales Baseline-Profil zu aktivieren.

  • Android-Gradle-Plug-in: com.android.tools.build:8.0.0
  • MacroBenchmark-Bibliothek: androidx.benchmark:benchmark-macro-junit4:1.2.4
  • Profilinstallationsprogramm: androidx.profileinstaller:profileinstaller:1.3.1

Wir empfehlen, die neueste Version von AGP zum Erstellen und Verwalten von Baseline-Profilen zu verwenden. Dies sind die wichtigsten Funktionen der verschiedenen AGP-Versionen:

AGP-Version Funktionen
8,3
  • Vollständige Unterstützung des Quellsatzverzeichnisses (Bibliotheksmodule): Geben Sie mehrere Quelldateien des Baseline-Profils an und verwenden Sie variantenbasierte Verzeichnisse wie src/free/generated/baselineProfiles/baseline-prof1.txt jetzt für Bibliotheks- und Anwendungsmodule.
  • Referenzprofile enthalten gewogene Klassen.
8.2
  • Umschreiben von Regeln in R8:D8 und R8 können die visuell lesbaren Baseline- und Startprofil-Regeln so umwandeln, dass alle Regeln zum Optimieren der Anwendungsleistung vollständig erfasst werden. Erhöht die Abdeckung des Referenzprofils von Methoden um ca. 30% und erhöht die Anwendungsleistung um etwa 15%.
  • Startprofile: Generieren Sie diesen neuen Referenzprofiltyp, um das Layout des Codes in DEX zu verbessern. Erhöht die Startleistung um weitere ca. 15 % bzw. deutlich mehr für große Anwendungen.
8.0 Empfohlene Mindestversion:Verwenden Sie das Gradle-Plug-in „Baseline Profile“, um Baseline-Profile mit einer einzelnen Gradle-Aufgabe zu generieren.
  • Vollständige Unterstützung des Quellsatzverzeichnisses (App-Module): Geben Sie mehrere Quelldateien des Baseline-Profils an und verwenden Sie variantenbasierte Verzeichnisse wie src/free/generated/baselineProfiles/baseline-prof1.txt.
7,4 Unterstützte Mindestversion: Anwendungen können Baseline-Profile aus Bibliotheken nutzen und ein eigenes Baseline-Profil in der Datei src/main/baseline-prof.txt angeben.
  • Baseline-Profile werden korrekt verpackt, wenn das APK aus einem App Bundle erstellt wird (Problem #230361284).
  • Bei Anwendungen mit mehr als einer .dex-Datei sind Baseline-Profile korrekt für die primäre .dex-Datei verpackt.

Beispiel für die Profilerstellung

Im Folgenden finden Sie eine Beispielklasse zum Erstellen eines Baseline-Profils für den App-Start sowie mehrerer Navigations- und Scroll-Ereignisse mit der empfohlenen MacroBenchmark-Bibliothek:

@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun appStartupAndUserJourneys() {
        baselineProfileRule.collect(packageName = PACKAGE_NAME) {
            // App startup journey.
            startActivityAndWait()

            device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
            device.findObject(By.res("myLazyColumn")).also {
                it.fling(Direction.DOWN)
                it.fling(Direction.UP)
            }
            device.pressBack()
        }
    }
}

Sie können diesen Code im vollständigen Kontext und im Detail als Teil unserer Leistungsbeispiele auf GitHub sehen.

Inhalte

Wenn Sie Baseline-Profile in einer App verwenden, können Sie den App-Startcode und gängige Nutzerinteraktionen wie Navigation zwischen Bildschirmen oder Scrollen einbeziehen. Sie können auch vollständige Abläufe wie Registrierung, Anmeldung oder Zahlung erfassen. Alle Nutzerpfade, die Sie für wichtig halten, können von Baseline-Profilen profitieren, da sie die Laufzeitleistung verbessern.

Wenn Sie mit verschiedenen Ansätzen zur Verbesserung der Leistung experimentieren, sollten Sie Baseline-Profile für beide Testverzweigungen einbeziehen. Auf diese Weise können Sie die Interpretation der Ergebnisse vereinfachen und dafür sorgen, dass alle Nutzer konsistent kompilierten Code ausführen.

Bibliotheken können eigene Baseline-Profile bereitstellen und ihnen Releases zur Verfügung stellen, um die Anwendungsleistung zu verbessern. Entsprechende Informationen finden Sie beispielsweise im Abschnitt zur Verwendung eines Referenzprofils in der Jetpack Compose-Leistung.

Funktionsweise von Baseline-Profilen

Sie können beim Entwickeln Ihrer Anwendung oder Bibliothek Referenzprofile definieren, um gängige Nutzerinteraktionen abzudecken, bei denen Renderingzeit oder Latenz wichtig sind. Funktionsweise:

  1. Für Ihre Anwendung werden menschenlesbare Profilregeln generiert und in der Anwendung in Binärform kompiliert. Sie finden sie unter assets/dexopt/baseline.prof. Anschließend können Sie das AAB wie gewohnt in Google Play hochladen.

  2. Google Play verarbeitet das Profil und sendet es zusammen mit dem APK direkt an die Nutzer. Während der Installation führt ART eine AOT-Kompilierung der Methoden im Profil durch, wodurch diese Methoden schneller ausgeführt werden. Wenn das Profil Methoden enthält, die beim App-Start oder während des Frame-Renderings verwendet werden, kann es zu kürzeren Startzeiten und weniger Verzögerungen kommen.

  3. Dieser Ablauf arbeitet mit der Cloud-Profil-Aggregation zusammen, um die Leistung basierend auf der tatsächlichen Nutzung der Anwendung im Laufe der Zeit zu optimieren.

Abbildung 1. Dieses Diagramm zeigt den Workflow des Baseline-Profils vom Upload bis zur Bereitstellung an den Endnutzer. Außerdem wird gezeigt, wie sich dieser Workflow auf Cloud-Profile bezieht.

Cloud-Profile

Cloud-Profile bieten zusammen mit Baseline-Profilen eine zusätzliche Form von PGO, die vom Google Play Store aggregiert und für die Kompilierung der Installationszeit verteilt wird.

Cloud-Profile basieren zwar auf tatsächlichen Nutzerinteraktionen mit der Anwendung, aber es dauert nach der Aktualisierung eines Updates mehrere Stunden bis Tage, wodurch die Verfügbarkeit eingeschränkt wird. Solange keine Profile vollständig verteilt sind, ist die Anwendungsleistung für Nutzer neuer oder aktualisierter Anwendungen nicht optimal. Darüber hinaus unterstützen Cloud Profile nur Android-Geräte mit Android 9 (API-Level 28) oder höher und lassen sich nur gut für Anwendungen mit einer ausreichend großen Nutzerbasis skalieren.

Kompilierungsverhalten in verschiedenen Android-Versionen

Die Android Platform-Versionen verwenden unterschiedliche Ansätze zur App-Kompilierung, die jeweils einen entsprechenden Leistungsabschwächer mit sich bringen. Baseline-Profile bieten im Vergleich zu den vorherigen Kompilierungsmethoden ein Profil für alle Installationen.

Android-Version Kompilierungsmethode Optimierungsansatz
5 bis 6 (API-Level 21 bis 23) Vollständiger AOT Die gesamte Anwendung wird während der Installation optimiert, was zu langen Wartezeiten bei der Nutzung der Anwendung, erhöhter RAM- und Speicherplatznutzung und längerer Zeit zum Laden von Code von der Festplatte führt. Dies kann zu längeren Kaltstartzeiten führen.
7 bis 8.1 (API-Level 24 bis 27) Teilweise AOT (Baseline Profile) Referenzprofile werden von androidx.profileinstaller bei der ersten Ausführung installiert, wenn das Anwendungsmodul diese Abhängigkeit definiert. ART kann dies weiter verbessern, indem während der Nutzung der Anwendung zusätzliche Profilregeln hinzugefügt und diese kompiliert werden, wenn das Gerät inaktiv ist. Dies optimiert den Speicherplatz und die Zeit zum Laden von Code vom Laufwerk, wodurch die Wartezeit für die Anwendung verkürzt wird.
9 (API-Level 28) und höher Teilweise AOT (Baseline + Cloud-Profil) Play verwendet bei App-Installationen Baseline-Profile, um das APK und die Cloud-Profile zu optimieren, sofern verfügbar. Nach der Installation werden ART-Profile bei Play hochgeladen, aggregiert und dann anderen Nutzern als Cloud-Profile zur Verfügung gestellt, wenn diese die Anwendung installieren oder aktualisieren.

Bekannte Probleme

Im Folgenden finden Sie mögliche Probleme und Lösungen bzw. Probleme, für die fortlaufende Lösungen zur Umgehung des Problems entwickelt werden:

  • Das Erstellen des Referenzprofils wird auf Firebase Test Lab-Geräten, einschließlich von Gradle-verwalteten Test Lab-Geräten, nicht unterstützt (Problem 285187547).

  • Verwenden Sie zum Bereitstellen von Baseline-Profilen für Bibliotheken mindestens das Baseline Profile Gradle-Plug-in 1.2.3 oder AGP 8.3 (Problem #313992099).

  • Wenn Sie Baseline-Profile mit dem Befehl ./gradlew app:generateBaselineProfile generieren, werden die Benchmarks im Testmodul ebenfalls ausgeführt und die Ergebnisse verworfen. In diesem Fall können Sie nur die Baseline-Profile generieren. Führen Sie dazu den Befehl mit -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile aus. Dieses Problem wurde in AGP 8.2 behoben.

  • Mit dem Befehl zum Generieren von Baseline-Profilen für alle Build-Typen – ./gradlew app:generateBaselineProfile – werden nur Baseline-Profile für den Release-Build-Typ generiert. Dieses Problem wurde in AGP 8.1 behoben.

  • App-Vertriebskanäle, die nicht aus dem Google Play Store stammen, unterstützen die Verwendung von Baseline-Profilen bei der Installation möglicherweise nicht. Nutzer von Anwendungen, die über diese Kanäle installiert werden, sehen die Vorteile erst, wenn die Hintergrunddexoptimierung ausgeführt wird, was wahrscheinlich über Nacht erfolgt.

  • Die interne App-Freigabe im Play Store unterstützt keine Referenzprofile, wohl aber der interne Test-Track.

  • Akkuoptimierungen auf einigen Geräten, z. B. Huawei-Geräten, können die Profilinstallation beeinträchtigen. Deaktivieren Sie alle Akkuoptimierungen in Ihren Benchmark-Geräten, damit Ihre Profile effektiv installiert werden.

Zusätzliche Ressourcen