Baseline-Profile – Übersicht

Baseline-Profile verbessern die Codeausführungsgeschwindigkeit um etwa 30% gegenüber dem Einführung, indem sie Interpretation und Just-in-Time (JIT) Kompilierungsschritte für Codepfade enthalten.

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 Gesamtleistung der Laufzeit für Nutzer ab dem ersten Start verbessern.

Diese Leistungsverbesserungen führen direkt zu verbesserten Geschäftsmesswerten wie wie Nutzerbindung, Transaktionen und Bewertungen. Weitere Informationen dazu, wie Sie wirkt sich die Leistung auf die Geschäftsmesswerte in Erfolgsgeschichten von Josh aus. 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. Wenn eine App schneller und reaktionsschneller wird, Baseline-Profile können zu mehr aktiven Nutzern pro Tag und einem höheren Durchschnitt führen Besuchsrate zurück.

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. Geführte AOT Die Kompilierung basiert nicht auf den Geräten der Nutzer und kann einmal pro Release auf einem Entwicklungsmaschine statt eines Mobilgeräts. Durch den Versand von Releases mit einer Baseline-Profil verwenden, sind Anwendungsoptimierungen viel schneller verfügbar als durch die Cloud-Profile.

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, unterscheiden sich jedoch darin, werden bei der Kompilierung und nicht zur On-Device-Optimierung verwendet. Start-up 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 classes.dex-Datei und der andere 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.2
  • Profilinstallationsprogramm: androidx.profileinstaller:profileinstaller:1.4.1

Wir empfehlen, zum Erstellen und Verwalten von Baseline die neueste Version von AGP zu verwenden Profile. Dies sind die wichtigsten Funktionen, die in den verschiedenen Versionen verfügbar sind. des AGP:

AGP-Version Funktionen
8,4 Bei lokalen App-Installationen von nicht debuggbaren Builds mit dem Gradle-Wrapper-Befehlszeilentool oder Android Studio-Installations-Baseline-Profilen entspricht die Leistung Ihres lokalen Release-Builds eher der Produktionsumgebung. Diese Aktualisierung hat keine Auswirkungen auf die Produktionsleistung von Baseline-Profilen.
8,3
  • Vollständige Unterstützung des Quellsatzverzeichnisses (Bibliotheksmodule): mehrere Quelldateien des Baseline-Profils deklarieren und Varianten von Verzeichnissen, wie z. B. src/free/generated/baselineProfiles/baseline-prof1.txt, jetzt für Bibliotheksmodule sowie für App-Module.
  • Baseline-Profile beinhalten desugared Klassen ermittelt.
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 Abdeckung des Baseline-Profils für Methoden um etwa 30 % und die App-Leistung um etwa 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 bei großen Apps deutlich mehr.
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 Referenzprofile. Quelldateien abrufen und variantenbasierte Verzeichnisse verwenden, z. B. src/free/generated/baselineProfiles/baseline-prof1.txt
7,4 Unterstützte Mindestversion: Apps können Baseline-Profile nutzen. aus Bibliotheken erstellen und ein eigenes Baseline-Profil src/main/baseline-prof.txt-Datei.
  • 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 Profilerstellung

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 App-Startcode und häufige Nutzerinteraktionen wie Navigation zwischen Bildschirmen oder Scrollen. 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 dadurch die Laufzeitleistung verbessert.

Wenn Sie mit verschiedenen Ansätzen zur Leistungsverbesserung experimentieren, sollten Sie Baseline-Profile für beide Verzweigungen des Tests aufnehmen. Durch können Sie die Interpretation Ihrer Ergebnisse verbessern, indem Sie sicherstellen, die Nutzer kompilierten Code ständig ausführen.

Bibliotheken können ihre eigenen Baseline-Profile bereitstellen und diese mit Releases an die App-Leistung zu verbessern. Weitere Informationen finden Sie beispielsweise im Abschnitt Baseline-Profil verwenden Leistung von Jetpack Compose.

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. So funktionierts:

  1. Für Ihre App werden menschenlesbare Profilregeln generiert und in Binärform in der App. Du findest 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 in damit 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 zu kürzeren Startzeiten und weniger Verzögerungen kommen.

  3. Dieser Ablauf wird mit der Cloud-Profile-Aggregation 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 Upload bis zur Bereitstellung für Endnutzer und wie dieser Workflow sich 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 zur Kompilierung zur Installationszeit verteilt wird.

Cloud-Profile basieren zwar auf den Interaktionen echter Nutzer mit der App, es dauert aber mehrere Stunden bis Tage, bis ein Update verteilt wird. 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 unter 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 verbessern die vorherigen Kompilierungsmethoden, indem ein Profil für alle Installationen bereitgestellt wird.

Android-Version Kompilierungsmethode Optimierungsansatz
5 bis 6 (API-Level 21 bis 23) Vollständige AOT Die gesamte App ist optimiert. während der Installation, sodass lange Wartezeiten zu vermeiden, die App, mehr RAM und Speicherplatznutzung und längere Ladezeiten des Codes möglicherweise von der Festplatte zunehmender Kaltstart Mal.
7 bis 8.1 (API Level 24 bis 27) Teilweise AOT (Baseline-Profil) Referenzprofile sind installiert von androidx.profileinstaller bei der ersten Ausführung, App-Modul definiert dies Abhängigkeit. ART kann dies weiter verbessern, indem während der Nutzung der App zusätzliche Profilregeln hinzugefügt und kompiliert werden, wenn das Gerät inaktiv ist. 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 Teilweise AOT (Baseline + Cloud-Profil) Play verwendet Baseline-Profile bei App-Installationen bis zu das APK und die Cloud Profilen (falls verfügbar). Nach der Installation ART auf Ihr Google Ads-Konto „Abspielen“, „Zusammenfassen“ und dann als Cloud-Profile bereitgestellt für andere Nutzende, wenn sie die App zu installieren oder zu 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. Deaktivieren Sie dazu in den Entwickleroptionen die Option Berechtigungsüberwachung deaktivieren.

  • Die Erstellung von Referenzprofilen wird auf Firebase Test Lab-Geräten nicht unterstützt. einschließlich von Gradle-verwalteten Test Lab-Geräten (Problem-Nr. 285187547)

  • Um Baseline-Profile für Bibliotheken erfolgreich bereitzustellen, verwenden Sie Baseline Profile Gradle-Plug-in 1.2.3 oder AGP 8.3 (mindestens) (Problem-Nr. 313992099)

  • Wenn Sie Baseline-Profile mit dem Befehl ./gradlew app:generateBaselineProfile, die Benchmarks im Testmodul ausgeführt und die Ergebnisse werden 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 Referenzprofile bei der Installation. Nutzer von Apps, die über diese die Vorteile erst, wenn die Hintergrund-Dexopt-Funktion ausgeführt wird, wahrscheinlich über Nacht.

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

  • Die Akku-Optimierung auf einigen Geräten, z. B. Huawei-Geräten, kann mit der Profilinstallation. Um sicherzustellen, dass Ihre Profile installiert sind die Akkuoptimierung in Ihren Benchmark-Geräten zu deaktivieren.

Weitere Informationen