Baseline-Profile – Übersicht

Mit Baseline-Profilen lässt sich die Codeausführungsgeschwindigkeit im Vergleich zur ersten Ausführung um etwa 30% verbessern, da die Interpretation und die Just-in-Time-Kompilierung (JIT) für die enthaltenen Codepfade vermieden werden.

Wenn Sie ein Baseline-Profil in einer App oder Bibliothek bereitstellen, kann die Android Runtime (ART) bestimmte Codepfade durch eine AOT-Kompilierung (Ahead-of-Time) optimieren und so die Leistung für jeden neuen Nutzer und jedes App-Update verbessern. Mit dieser profilgestützten Optimierung (PGO) können Apps den Start optimieren, Ruckler bei Interaktionen reduzieren und die Gesamtlaufzeitleistung für Nutzer ab dem ersten Start 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 den Erfolgsgeschichten von Josh, Lyft, TikTok und Zomato.

Vorteile von Baseline-Profilen

Mit Baseline-Profilen werden alle Nutzerinteraktionen wie das Starten der App, das Wechseln zwischen Bildschirmen oder das Scrollen durch Inhalte von Anfang an flüssiger. Durch die Steigerung der Geschwindigkeit und Reaktionsfähigkeit einer App können Baseline-Profile zu mehr aktiven Nutzern pro Tag und einer höheren durchschnittlichen Wiederkehrrate führen.

Mit Baseline-Profilen können Sie die App nicht nur beim Start optimieren, sondern auch häufige Nutzerinteraktionen berücksichtigen, um die App-Laufzeit ab dem ersten Start zu verbessern. Die geführte AOT-Kompilierung basiert nicht auf Nutzergeräten und kann einmal pro Release auf einem Entwicklungscomputer statt auf einem Mobilgerät durchgeführt werden. Wenn Sie Releases mit einem Baseline-Profil bereitstellen, sind App-Optimierungen viel schneller verfügbar als bei der Verwendung von Cloud-Profilen allein.

Wenn Sie kein Baseline-Profil verwenden, wird der gesamte App-Code 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 Leistung für Nutzer suboptimal, bis neue Codepfade optimiert wurden. Viele Apps messen nach der Optimierung eine Leistungssteigerung von etwa 30 %.

Start-up-Profile

Startprofile ähneln Baseline-Profilen. Der Unterschied besteht jedoch darin, dass sie bei der Kompilierung und nicht zur Optimierung auf dem Gerät verwendet werden. Mit einem Startprofil wird das Layout der DEX-Datei optimiert, um die Startzeiten zu verbessern. Der im Startprofil angegebene Code wird in die primäre classes.dex-Datei und anderer Code in separate DEX-Dateien kopiert. Dadurch werden die Startzeiten verbessert, da die Anzahl der Seitenfehler beim Starten der App reduziert wird. Weitere Informationen dazu, wie Startprofile und DEX-Layoutoptimierungen die App-Startzeiten verbessern können, finden Sie unter DEX-Layoutoptimierungen und Startprofile.

Erste Schritte

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

Die Abhängigkeitskette bietet stabile und Entwicklungsversionen. Zum Generieren und Installieren eines Baseline-Profils müssen Sie die folgenden unterstützten Versionen oder eine höhere Version des Android-Gradle-Plug-ins, der MacroBenchmark-Bibliothek und des Profile Installer verwenden. Diese Abhängigkeiten werden zu unterschiedlichen Zeiten benötigt und arbeiten als Toolchain zusammen, 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.3
  • Profilinstallationsprogramm: androidx.profileinstaller:profileinstaller:1.4.1

Wir empfehlen, die neueste Version von AGP zu verwenden, um Baseline-Profile zu erstellen und zu verwalten. Hier sind die wichtigsten Funktionen der verschiedenen AGP-Versionen:

AGP-Version Funktionen
8,4 Bei lokalen App-Installationen nicht debugbarer Builds mit dem Gradle-Wrapper-Befehlszeilentool oder Android Studio-Installations-Baseline-Profilen entspricht die Leistung des lokalen Release-Builds eher der Produktionsumgebung. Diese Aktualisierung hat keine Auswirkungen auf die Produktionsleistung von Baseline-Profilen.
8,3
  • Vollständige Unterstützung von Verzeichnissen für Quellsätze (Bibliotheksmodule): Sie können jetzt mehrere Quelldateien für das Baseline-Profil deklarieren und variantenspezifische Verzeichnisse wie src/free/generated/baselineProfiles/baseline-prof1.txt für Bibliotheks- und App-Module verwenden.
  • Baseline-Profile enthalten entzugerte Klassen.
8.2
  • R8-Umschreibung von Regeln: Mit D8 und R8 können die für Menschen lesbaren Regeln für das Baseline- und das Startprofil so transformiert werden, dass alle Regeln vollständig erfasst werden, die zum Optimieren der Anwendungsleistung erforderlich sind. Erhöht die Abdeckung des Baseline-Profils für Methoden um etwa 30% und die App-Leistung um etwa 15%.
  • Start-up-Profile: Generieren Sie diesen neuen Typ von Baseline-Profil, um das Layout des Codes in DEX festzulegen. Erhöht die Startleistung um weitere ~ 15 % oder deutlich mehr bei großen Apps.
8.0 Empfohlene Mindestversion: Verwenden Sie das Baseline Profile Gradle-Plug-in, um Baseline-Profile mit einer einzelnen Gradle-Aufgabe zu generieren.
  • Vollständige Unterstützung von Verzeichnissen für Quellsätze (App-Module): Deklarieren Sie mehrere Quelldateien für das Baseline-Profil und verwenden Sie variantenspezifische Verzeichnisse wie src/free/generated/baselineProfiles/baseline-prof1.txt.
7,4 Mindestunterstützte Version: Apps können Baseline-Profile aus Bibliotheken verwenden und ein eigenes Baseline-Profil in der Datei src/main/baseline-prof.txt angeben.
  • Baseline-Profile werden beim Erstellen des APK aus einem App-Bundle korrekt verpackt (Problem #230361284).
  • Bei Apps mit mehreren .dex-Dateien werden Baseline-Profile korrekt für die primäre .dex-Datei verpackt.

Beispiel für die Profilgenerierung

Im Folgenden finden Sie eine Beispielklasse zum Erstellen eines Baseline-Profils für den App-Start sowie mehrere Navigations- und Scrollereignisse 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()
        }
    }
}

Den vollständigen Code und weitere Details finden Sie in unseren Leistungsbeispielen auf GitHub.

Inhalte

Wenn Sie Baseline-Profile in einer App verwenden, können Sie Code zum Starten der App und gängige Nutzerinteraktionen wie die Navigation zwischen Bildschirmen oder das Scrollen einbinden. Sie können auch ganze Abläufe wie Registrierung, Anmeldung oder Zahlung erfassen. Alle Nutzerpfade, die Sie als kritisch erachten, können von Baseline-Profilen profitieren, da sich so die Laufzeitleistung verbessert.

Wenn Sie mit verschiedenen Ansätzen zur Leistungsverbesserung experimentieren, sollten Sie Referenzprofile für beide Verzweigungen des Tests hinzufügen. So können Sie Ihre Ergebnisse leichter interpretieren, da alle Nutzer immer den kompilierten Code ausführen.

Bibliotheken können eigene Baseline-Profile bereitstellen und mit Releases ausliefern, um die App-Leistung zu verbessern. Weitere Informationen finden Sie beispielsweise im Abschnitt Grundlagenprofil für die Leistung von Jetpack Compose verwenden.

Funktionsweise von Baseline-Profilen

Sie können bei der Entwicklung Ihrer Anwendung oder Bibliothek Referenzprofile definieren, um häufige Nutzerinteraktionen abzudecken, bei denen die Renderingzeit oder -latenz wichtig ist. So funktioniert es:

  1. Für Ihre App werden für Menschen lesbare Profilregeln generiert und in der App in binäre 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 eine 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 Frame-Rendering verwendet werden, kann der Nutzer schnellere Startzeiten und weniger Ruckler feststellen.

  3. Dieser Ablauf arbeitet mit der Cloud-Profile-Aggregation zusammen, 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 Baseline-Profile vom Upload bis zur Zustellung an den 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 vom Google Play Store aggregiert und zur Kompilierung zur Installationszeit verteilt wird.

Cloud-Profile basieren auf den Interaktionen echter Nutzer mit der App. Nach einem Update dauert es jedoch mehrere Stunden bis Tage, bis sie verteilt werden. Das schränkt ihre Verfügbarkeit ein. Bis die Profile vollständig verteilt sind, ist die App-Leistung für Nutzer neuer oder aktualisierter Apps nicht optimal. Außerdem werden Cloud-Profile nur von Android-Geräten mit Android 9 (API-Level 28) oder höher unterstützt und skalieren nur gut für Apps mit einer ausreichend großen Nutzerbasis.

Kompilierungsverhalten bei verschiedenen Android-Versionen

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

Android-Version Kompilierungsmethode Optimierungsansatz
5 bis 6 (API-Level 21 bis 23) Vollständige AOT Die gesamte Anwendung wird während der Installation optimiert. Dies führt zu langen Wartezeiten bei der Verwendung der Anwendung, erhöhter RAM- und Speicherplatznutzung und längerem Laden von Code von der Festplatte, was zu einer längeren Kaltstartzeit führen kann.
7 bis 8.1 (API-Level 24 bis 27) Teilweise AOT (Baseline-Profil) 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 Verwendung der App zusätzliche Profilregeln hinzugefügt und diese bei Inaktivität des Geräts kompiliert werden. Dadurch wird der Speicherplatz optimiert und die Zeit zum Laden von Code vom Laufwerk verkürzt, was die Wartezeit für die App verringert.
9 (API-Level 28) und höher Partielles AOT (Baseline + Cloud-Profil) Google Play verwendet bei App-Installationen Baseline-Profile, um die APK- und Cloud-Profile zu optimieren, sofern verfügbar. Nach der Installation werden ART-Profile in Play hochgeladen, aggregiert 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 Lösungen entwickelt werden:

  • Die Generierung des Baseline-Profils kann auf einigen Geräten, einschließlich OnePlus-Geräten, aufgrund von Berechtigungseinstellungen fehlschlagen. Sie können das Problem umgehen, indem Sie in den Entwickleroptionen die Option Berechtigungsmonitoring deaktivieren deaktivieren.

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

  • Verwenden Sie mindestens das Baseline Profile Gradle-Plug-in 1.2.3 oder AGP 8.3, um Baseline-Profile für Bibliotheken bereitzustellen (Problem 313992099).

  • Wenn Sie mit dem Befehl ./gradlew app:generateBaselineProfile Baseline-Profile generieren, werden auch die Benchmarks im Testmodul ausgeführt und die Ergebnisse werden verworfen. In diesem Fall können Sie nur die Referenzprofile 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 Buildtypen – ./gradlew app:generateBaselineProfile – generiert nur Baseline-Profile für den Release-Buildtyp. Dieses Problem wurde in AGP 8.1 behoben.

  • App-Vertriebskanäle, die nicht zum Google Play Store gehören, unterstützen die Verwendung von Baseline-Profilen bei der Installation möglicherweise nicht. Nutzer von Apps, die über diese Kanäle installiert wurden, sehen die Vorteile erst, wenn dexopt im Hintergrund ausgeführt wird – was wahrscheinlich über Nacht geschieht.

  • Die interne App-Freigabe im Play Store unterstützt keine Baseline-Profile. Der Track für interne Tests unterstützt sie jedoch.

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

Weitere Informationen