Baseline-Profile – Übersicht

Mit Baseline-Profilen wird die Codeausführungsgeschwindigkeit beim ersten Start um etwa 30% verbessert, da Interpretations- und Just-in-Time-Kompilierungs-Schritte für enthaltene Codepfade vermieden werden.

Wenn Sie ein Baseline-Profil in einer App oder Bibliothek bereitstellen, kann die Android-Laufzeit (ART) bestimmte Codepfade durch Ahead-of-Time-Kompilierung (AOT) optimieren. Das führt zu Leistungssteigerungen für jeden neuen Nutzer und jedes App-Update. Mit dieser profilgesteuerten Optimierung (Profile Guided Optimization, PGO) können Apps den Start optimieren, Ruckeln bei Interaktionen reduzieren und die allgemeine Laufzeitleistung für Nutzer ab dem ersten Start verbessern.

Diese Leistungsverbesserungen führen direkt zu besseren Geschäftskennzahlen wie Nutzerbindung, Transaktionen und Bewertungen. Weitere Informationen dazu, wie sich die Leistung auf Unternehmensmesswerte auswirkt, finden Sie in den Berichten von Josh, Lyft, TikTok und Zomato.

Vorteile von Baseline-Profilen

Mit Baseline-Profilen werden alle Nutzerinteraktionen wie das Starten der App, das Navigieren zwischen Bildschirmen oder das Scrollen durch Inhalte von Anfang an flüssiger. Durch die Erhöhung der Geschwindigkeit und Reaktionsschnelligkeit einer App können Baseline Profiles zu mehr aktiven Nutzern pro Tag und einer höheren durchschnittlichen Rückkehrrate führen.

Mithilfe von Baseline-Profilen kann die Optimierung über den App-Start hinaus erfolgen. Sie enthalten häufige Nutzerinteraktionen, die die App-Laufzeit ab dem ersten Start verbessern. Die AOT-Kompilierung mit Anleitung ist nicht von Nutzergeräten abhängig und kann einmal pro Release auf einem Entwicklercomputer anstelle eines Mobilgeräts erfolgen. Wenn Sie Releases mit einem Baseline-Profil ausliefern, sind App-Optimierungen viel schneller verfügbar, als wenn Sie sich nur auf Cloud-Profile verlassen.

Wenn kein Baseline-Profil verwendet wird, wird der gesamte App-Code entweder JIT-kompiliert (Just-in-Time) im Arbeitsspeicher, nachdem er interpretiert wurde, oder in eine odex-Datei im Hintergrund geschrieben, wenn das Gerät im Leerlauf ist. Nach der Installation oder Aktualisierung einer App ist die Nutzererfahrung suboptimal, bis neue Codepfade optimiert sind. Viele Apps verzeichnen nach der Optimierung eine Leistungssteigerung von etwa 30 %.

Start-up-Profile

Startprofile ähneln Baseline-Profilen, werden aber zur Kompilierzeit und nicht zur Optimierung auf dem Gerät verwendet. Ein Startprofil wird verwendet, um das Layout der DEX-Datei zu optimieren und so die Startzeiten zu verbessern. Der im Startprofil identifizierte Code wird in die primäre classes.dex-Datei eingefügt, anderer Code in separate DEX-Dateien. Dadurch werden die Startzeiten verbessert, da die Anzahl der Seitenfehler beim Starten der App reduziert wird. Weitere Informationen dazu, wie Startprofile und DEX-Layout-Optimierungen die Startzeiten von Apps verbessern können, finden Sie unter DEX-Layout-Optimierungen und Startprofile.

Erste Schritte

Informationen zum Optimieren der Leistung in Ihrer bestehenden App finden Sie unter Baseline-Profile erstellen.

Die Abhängigkeitskette bietet stabile und Entwicklungsversionen. Wenn Sie ein Baseline Profile generieren und installieren möchten, verwenden Sie die folgenden unterstützten Versionen oder höher des Android-Gradle-Plug-ins, der Macrobenchmark-Bibliothek und des Profile Installers. Diese Abhängigkeiten sind zu unterschiedlichen Zeiten erforderlich und bilden zusammen eine Toolchain, um ein optimales Baseline-Profil zu ermöglichen.

  • Android-Gradle-Plug-in: com.android.tools.build:8.0.0
  • Macrobenchmark-Bibliothek: androidx.benchmark:benchmark-macro-junit4:1.3.4
  • Profilinstallationsprogramm: androidx.profileinstaller:profileinstaller:1.4.1

Wir empfehlen, die aktuelle Version von AGP zum Erstellen und Verwalten von Baseline-Profilen zu verwenden. Hier sind die wichtigsten Funktionen, die mit den verschiedenen Versionen von AGP verfügbar sind:

AGP-Version Funktionen
8,4 Bei lokalen App-Installationen von nicht debugfähigen Builds mit dem Gradle-Wrapper-Befehlszeilentool oder Android Studio werden Baseline-Profile installiert, sodass die Leistung Ihres lokalen Release-Builds der Produktion ähnelt. Diese Änderung hat keine Auswirkungen auf die Produktionsleistung von Baseline-Profilen.
8,3
  • Unterstützung für vollständige Quellsets (Bibliotheksmodule): Sie können mehrere Baseline Profile-Quelldateien deklarieren und variantenbezogene Verzeichnisse wie src/free/generated/baselineProfiles/baseline-prof1.txt verwenden, jetzt auch für Bibliotheksmodule und nicht nur für App-Module.
  • Baseline-Profile enthalten entzuckerte Klassen.
8.2
  • R8-Neuschreiben von Regeln:D8 und R8 können die lesbaren Baseline- und Startup-Profilregeln so umwandeln, dass alle Regeln, die Sie zur Optimierung der App-Leistung benötigen, vollständig erfasst werden. Erhöht die Baseline Profile-Abdeckung von Methoden um etwa 30% und die App-Leistung um etwa 15%.
  • Startprofile:Diese neue Art von Baseline-Profil wird generiert, um das Layout von Code in DEX zu optimieren. Die Startleistung wird um weitere ca. 15 % gesteigert, bei großen Apps sogar noch mehr.
8.0 Mindestempfehlung:Verwenden Sie das Baseline Profile Gradle-Plug-in, um Baseline Profiles mit einer einzigen Gradle-Aufgabe zu generieren.
  • Unterstützung für vollständige Quellsatzverzeichnisse (App-Module): Deklarieren Sie mehrere Baseline Profile-Quelldateien und verwenden Sie variantenbezogene Verzeichnisse wie src/free/generated/baselineProfiles/baseline-prof1.txt.
7.4 Mindestversion: Apps können Baseline-Profile aus Bibliotheken verwenden und ein eigenes Baseline-Profil in der Datei src/main/baseline-prof.txt bereitstellen.
  • Baseline-Profile werden beim Erstellen des APK aus einem App-Bundle korrekt verpackt (Problem 230361284).
  • Bei Apps mit mehr als einer .dex-Datei werden Baseline-Profile korrekt für die primäre .dex-Datei verpackt.

Beispiel für die Profilerstellung

Im Folgenden sehen Sie ein Beispiel für eine Klasse zum Erstellen eines Baseline-Profils für den App-Start sowie für mehrere 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()
        }
    }
}

Diesen Code können Sie im vollständigen Kontext und mit weiteren Details in unseren Leistungsbeispielen auf GitHub ansehen.

Inhalte

Wenn Sie Baseline-Profile in einer App verwenden, können Sie App-Startcode und häufige Nutzerinteraktionen wie die Navigation zwischen Bildschirmen oder das Scrollen einbeziehen. Sie können auch ganze Abläufe wie Registrierung, Anmeldung oder Zahlung erfassen. Alle Nutzeraktionen, die Sie als kritisch einstufen, können von Baseline Profiles profitieren, da sich dadurch die Laufzeitleistung verbessert.

Wenn Sie mit verschiedenen Ansätzen experimentieren, um die Leistung zu verbessern, sollten Sie Baseline-Profile für beide Testgruppen einbeziehen. So können Sie Ihre Ergebnisse leichter interpretieren, da alle Nutzer einheitlich kompilierten Code ausführen.

Bibliotheken können eigene Baseline-Profile bereitstellen und sie mit Releases ausliefern, um die App-Leistung zu verbessern. Ein Beispiel finden Sie im Abschnitt Baseline-Profil verwenden unter Jetpack Compose-Leistung.

Funktionsweise von Baseline-Profilen

Beim Entwickeln Ihrer App oder Bibliothek sollten Sie Baseline-Profile definieren, die häufige Nutzerinteraktionen abdecken, bei denen Rendering-Zeit oder Latenz wichtig sind. So funktionieren sie:

  1. Für Ihre App werden für Menschen lesbare Profilregeln generiert und in der App in binärer Form kompiliert. Sie finden sie in assets/dexopt/baseline.prof. Anschließend können Sie das AAB wie gewohnt bei 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 die AOT-Kompilierung der Methoden im Profil durch, wodurch diese Methoden schneller ausgeführt werden. Wenn das Profil Methoden enthält, die beim Starten der App oder beim Rendern von Frames verwendet werden, kann es sein, dass die App schneller startet und weniger Ruckler auftreten.

  3. Dieser Ablauf wird mit der Aggregation von Cloud-Profilen kombiniert, um die Leistung basierend auf der tatsächlichen Nutzung der App im Laufe der Zeit zu optimieren.

Abbildung 1: Dieses Diagramm zeigt den Workflow für das Baseline-Profil vom Hochladen bis zur Bereitstellung für Endnutzer und wie dieser Workflow mit Cloud-Profilen zusammenhängt.

Cloud-Profile

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

Cloud-Profile basieren zwar auf realen Nutzerinteraktionen mit der App, es dauert aber mehrere Stunden bis Tage, bis sie nach einem Update verteilt werden. Dadurch ist ihre Verfügbarkeit eingeschränkt. Bis Profile vollständig verteilt sind, ist die App-Leistung für Nutzer neuer oder aktualisierter Apps suboptimal. Außerdem werden Cloud-Profile nur auf Android-Geräten mit Android 9 (API-Level 28) oder höher unterstützt und lassen sich nur für Apps mit einer ausreichend großen Nutzerbasis gut skalieren.

Kompilierungsverhalten in verschiedenen Android-Versionen

Für Android-Plattformversionen werden unterschiedliche Ansätze für die App-Kompilierung verwendet, die jeweils mit einem entsprechenden Leistungs-Trade-off verbunden sind. Baseline-Profile sind eine Verbesserung gegenüber den bisherigen Kompilierungsmethoden, da sie ein Profil für alle Installationen bereitstellen.

Android-Version Zusammenstellungsmethode Optimierungsansatz
5 bis 6 (API-Level 21 bis 23) Vollständige AOT Die gesamte App wird während der Installation optimiert. Das führt zu langen Wartezeiten, bis die App verwendet werden kann, zu einer erhöhten RAM- und Festplattennutzung und zu längeren Ladezeiten für Code von der Festplatte, was die Kaltstartzeiten möglicherweise verlängert.
7 bis 8.1 (API-Level 24 bis 27) Teilweise AOT (Baseline-Profil) Baseline-Profile werden von androidx.profileinstaller bei der ersten Ausführung installiert, wenn das App-Modul diese Abhängigkeit definiert. ART kann dies weiter verbessern, indem während der Nutzung der App zusätzliche Profilregeln hinzugefügt und kompiliert werden, wenn das Gerät im Leerlauf ist. Dadurch wird der Speicherplatz optimiert und die Zeit zum Laden von Code von der Festplatte verkürzt, wodurch die Wartezeit für die App reduziert wird.
9 (API-Level 28) und höher Teilweise AOT (Baseline + Cloud-Profil) Play verwendet Baseline-Profile bei der Installation von Apps, um das APK und Cloud-Profile (falls verfügbar) zu optimieren. Nach der Installation werden ART-Profile in Play hochgeladen, zusammengefasst und dann anderen Nutzern als Cloud-Profile zur Verfügung gestellt, wenn sie die App installieren oder aktualisieren.

Bekannte Probleme

Im Folgenden finden Sie mögliche Probleme und Lösungen oder Probleme, für die derzeit Workarounds entwickelt werden:

  • Die Erstellung des Baseline-Profils kann aufgrund von Berechtigungseinstellungen auf einigen Geräten, einschließlich OnePlus-Geräten, fehlschlagen. Um dieses Problem zu umgehen, deaktivieren Sie in den Entwickleroptionen die Option Berechtigungsüberwachung deaktivieren.

  • Die Generierung von Baseline-Profilen wird auf Firebase Test Lab-Geräten nicht unterstützt, einschließlich Gradle-verwalteter Test Lab-Geräte (Problem 285187547).

  • Damit Baseline Profiles für Bibliotheken erfolgreich bereitgestellt werden können, müssen Sie mindestens das Baseline Profile Gradle-Plug-in 1.2.3 oder AGP 8.3 verwenden (Problem 313992099).

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

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

  • Bei Vertriebskanälen für Apps, die nicht über den Google Play Store erfolgen, wird die Verwendung von Baseline-Profilen bei der Installation möglicherweise nicht unterstützt. Nutzer von Apps, die über diese Kanäle installiert wurden, sehen die Vorteile erst, wenn die Hintergrund-Dexoptimierung ausgeführt wird, was wahrscheinlich über Nacht geschieht.

  • Die interne App-Freigabe im Play Store unterstützt keine Baseline-Profile, der interne Test-Track jedoch schon.

  • Die Akkuoptimierung auf einigen Geräten, z. B. Huawei-Geräten, kann die Profilinstallation beeinträchtigen. Damit Ihre Profile effektiv installiert werden, sollten Sie alle Akkuoptimierungen auf Ihren Benchmark-Geräten deaktivieren.

Zusätzliche Ressourcen