Baseline-Profile – Übersicht

Baseline-Profile verbessern die Geschwindigkeit der Codeausführung ab dem ersten Start um etwa 30 %, da sie Interpretation und Just-in-Time (JIT)-Kompilierungsschritte für enthaltene Codepfade vermeiden.

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 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 Erhöhung der Geschwindigkeit und Reaktionsfähigkeit einer App können Referenzprofile zu mehr aktiven Nutzern pro Tag und einer höheren durchschnittlichen Besuchsrate durch wiederholte Besuche 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 Anwendung ist die Nutzung von der ersten Ausführung bis zur Optimierung neuer Codepfade für Nutzer nicht optimal. Bei vielen Apps wird nach der Optimierung eine Leistungssteigerung von etwa 30 % gemessen.

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. Verwenden Sie zum Generieren und Installieren eines Baseline-Profils die folgenden unterstützten Versionen oder höher des Android Gradle-Plug-ins, der Macrobenchmark-Bibliothek und des Profil-Installationsprogramms. Diese Abhängigkeiten sind zu unterschiedlichen Zeiten erforderlich und bilden zusammen eine Toolchain, die ein optimales Baseline-Profil ermöglicht.

  • Android-Gradle-Plug-in: com.android.tools.build:8.0.0
  • MacroBenchmark-Bibliothek: androidx.benchmark:benchmark-macro-junit4:1.3.3
  • Profil-Installationsprogramm: androidx.profileinstaller:profileinstaller:1.4.1

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

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 Sie die visuell lesbaren Regeln für Baseline und Startprofil so transformieren, dass alle Regeln erfasst werden, die Sie zur Optimierung der App-Leistung benötigen. Erhöht die Baseline-Profilabdeckung von Methoden um ca. 30% und erhöht die Anwendungsleistung um ca. 15%.
  • Start-Profil: Dieser neue Typ von Baseline-Profil wird generiert, um das Layout des Codes in DEX zu bestimmen. 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 des Quellsatzverzeichnisses (Anwendungsmodule): Deklarieren Sie mehrere Quelldateien des Baseline-Profils und verwenden Sie Verzeichnisse, die die Varianten unterstützen, z. B. 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 Anwendungen mit mehr als einer .dex-Datei werden Baseline-Profile korrekt für die primäre .dex-Datei verpackt.

Beispiel für die Profilgenerierung

Mit der folgenden Beispielklasse können Sie ein Baseline-Profil für den Anwendungsstart sowie verschiedene Navigations- und Scroll-Ereignisse mit der empfohlenen MacroBenchmark-Bibliothek erstellen:

@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 sich diesen Code im vollständigen Kontext und im Detail als Teil unserer Leistungsbeispiele auf GitHub ansehen.

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 vollständige 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. Auf diese Weise lassen sich die Ergebnisse leichter interpretieren, da alle Nutzer konsistent kompilierten Code ausführen.

Bibliotheken können eigene Baseline-Profile bereitstellen und mit Releases ausliefern, um die App-Leistung zu verbessern. Entsprechende Informationen finden Sie beispielsweise im Abschnitt Baseline-Profil zur Leistung von Jetpack Compose verwenden.

Funktionsweise von Baseline-Profilen

Definieren Sie bei der Entwicklung Ihrer App oder Bibliothek Baseline-Profile, um gängige Nutzerinteraktionen abzudecken, bei denen die Renderingzeit oder Latenz wichtig sind. Funktionsweise:

  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 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 Start der App oder beim Frame-Rendering verwendet werden, kann es für den Nutzer zu kürzeren Startzeiten und weniger Verzögerungen kommen.

  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 eine zusätzliche Form von PGO – zusammengefasst nach Google Play Store und zur Kompilierung während der Installation bereitgestellt – zusammen mit Baseline-Profilen.

Cloud-Profile basieren zwar auf realen Nutzerinteraktionen mit der Anwendung, aber nach der Verteilung eines Updates dauert es mehrere Stunden bis Tage, was die Verfügbarkeit einschränkt. 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 unter verschiedenen Android-Versionen

Die Versionen der Android-Plattform verwenden unterschiedliche Ansätze für die App-Kompilierung, wobei die einzelnen Ansätze einen entsprechenden Leistungsabstrich haben. Baseline-Profile bieten eine Verbesserung gegenüber den vorherigen Kompilierungsmethoden, da sie ein Profil für alle Installationen bereitstellen.

Android-Version Kompilierungsmethode Optimierungsansatz
5 bis 6 (API-Level 21 bis 23) Volles 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-Ebene 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) Play verwendet während der App-Installationen Baseline-Profile, um die APK- und Cloud-Profile zu optimieren (falls 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 bzw. Probleme, für die es laufende Entwicklungen zur Umgehung des Problems gibt:

  • Die Erstellung des Referenzprofils kann aufgrund von Berechtigungseinstellungen auf einigen Geräten, einschließlich OnePlus-Geräten, 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 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 Buildtypen – ./gradlew app:generateBaselineProfile – generiert nur Baseline-Profile für den Release-Buildtyp. Dieses Problem wurde in AGP 8.1 behoben.

  • Kanäle, die nicht aus dem Google Play Store stammen, unterstützen die Verwendung von Referenzprofilen 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.

  • Bei der internen App-Freigabe im Play Store werden Baseline-Profile nicht unterstützt. Dies gilt jedoch für den internen Test-Track.

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

Weitere Informationen