Baseline-Profile – Übersicht

Baseline-Profile verbessern die Ausführungsgeschwindigkeit von Code ab dem ersten Start um etwa 30 %, da die Schritte zur Interpretation und Just-in-time (JIT) Kompilierung für die enthaltenen Codepfade vermieden werden.

Wenn ein Baseline-Profil in einer App oder Bibliothek enthalten ist, kann Android Runtime (ART) bestimmte Codepfade durch Ahead-of-Time (AOT)-Kompilierung optimieren. So wird die Leistung für jeden neuen Nutzer und bei jedem App-Update verbessert. Mit dieser profilgestützten Optimierung (Profile Guided Optimization, PGO) können Apps ab dem ersten Start optimiert werden, die Interaktionsverzögerung kann reduziert und die allgemeine Laufzeitleistung für Nutzer verbessert werden.

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

Vorteile von Baseline-Profilen

Baseline-Profile ermöglichen die Vorabkompilierung von Code bei kritischen Nutzerinteraktionen wie App-Start, Navigation zwischen Bildschirmen oder Scrollen durch Inhalte. So werden diese Interaktionen ab der ersten Ausführung reibungsloser. Durch die Erhöhung 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.

Baseline-Profile helfen, die Optimierung über den App-Start hinaus zu lenken, indem sie gängige Nutzerinteraktionen bereitstellen, die die App-Laufzeit ab dem ersten Start verbessern. Die geführte AOT Kompilierung ist nicht von Nutzergeräten abhängig und kann einmal pro Release auf einem Entwicklungscomputer anstelle eines Mobilgeräts durchgeführt werden. Wenn Releases mit einem Baseline-Profil ausgeliefert werden, sind App-Optimierungen viel schneller verfügbar als bei der Verwendung von Cloud-Profilen allein.

Wenn kein Baseline-Profil verwendet wird, 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 im Leerlauf ist. Nach der Installation oder Aktualisierung einer App ist die Nutzererfahrung ab der ersten Ausführung suboptimal, bis neue Codepfade optimiert sind. Viele Apps verzeichnen nach der Optimierung eine Leistungssteigerung von etwa 30 %.

Startprofile

Startprofile ähneln Baseline-Profilen, werden aber zur Kompilierzeit verwendet, um das DEX-Layout für schnellere Startzeiten zu optimieren, und nicht für die Optimierung auf dem Gerät. Weitere Informationen zu den Unterschieden zwischen Startprofilen und Baseline Profilen finden Sie unter Baseline-Profile und Startprofile vergleichen. Weitere Informationen zur DEX-Layoutoptimierung finden Sie unter DEX-Layoutoptimierungen und Start profile.

Jetzt starten

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

Profilgenerierung im Vergleich zu Release-Builds

Es ist wichtig, den Unterschied zwischen den Build-Konfigurationen zu kennen, die beim Generieren von Baseline- und Startprofildateien (z. B. baseline-prof.txt und startup-prof.txt) erforderlich sind, und den Build-Konfigurationen, die beim Erstellen des endgültigen Release-APKs verwendet werden, das diese Profile nutzt.

Beim Generieren von Profildateien (z. B. benchmark):

Wenn Sie ein Baseline-Profil mit einem Test erfassen, darf Ihre App nicht verschleiert sein. Damit die generierten Profilregeln genau mit den Methodensignaturen Ihres Codes übereinstimmen, müssen Sie die Verschleierung und Optimierung (R8) für die Build-Variante deaktivieren, die für die Profilgenerierung verwendet wird. Diese Variante muss sich von Ihrer Release-Build-Variante unterscheiden, bei der Verschleierung und Optimierung aktiviert sind. Dazu legen Sie isMinifyEnabled = false für die Build-Variante zur Profilgenerierung fest. Wenn Sie das Baseline-Profil-Gradle-Plug-in nicht verwenden, sollten Sie auch darauf achten, dass -dontobfuscate und -dontoptimize angewendet werden. Das Baseline-Profil-Gradle Plug-in übernimmt diese Konfiguration automatisch für Sie.

Sie können prüfen, ob Ihre App während der Profilgenerierung nicht verschleiert wurde, indem Sie die generierte Textprofildatei (z. B. baseline-prof.txt) öffnen und prüfen, ob die Klassen- und Methodennamen nicht verschleiert sind.

Beim Erstellen des endgültigen Release-APKs:

Wenn Sie Ihre Release-App erstellen, sollte sie verschleiert sein. Für Ihren Release-Build muss isMinifyEnabled = true festgelegt sein, damit Sie von Verschleierung, Minimierung und Optimierung profitieren können. R8 schreibt die Regeln aus Ihren nicht verschleierten Profildateien automatisch um, damit sie mit dem verschleierten und optimierten Code in Ihrem Release-APK übereinstimmen. Der Build nutzt die nicht verschleierte Textdatei, indem die Regeln korrekt transformiert werden.

Damit die DEX-Layoutoptimierung (durch Startprofile) funktioniert, muss Ihre Release-App verschleiert sein und R8 mit allen aktivierten Optimierungen verwenden.

Erweiterte Workflows (ohne Gradle):

Wenn Sie einen erweiterten Workflow ohne Gradle (z. B. Bazel, Buck oder benutzerdefinierte CI-Automatisierungspipelines) verwenden, um Ihre Profile zu generieren, müssen Sie trotzdem dieselben Prinzipien befolgen. Ihre App darf beim Erfassen des Profils nicht verschleiert oder optimiert sein. Wenn Sie jedoch Ihre Release-App erstellen, müssen Sie sie verschleiern. R8 verarbeitet die nicht verschleierte Textregeln-Datei und transformiert die Regeln korrekt, damit sie auf die verschleierte Release-App angewendet werden können.

Die Abhängigkeitskette bietet stabile und Entwicklungs-Release-Versionen. 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 Profilinstallationsprogramms. Diese Abhängigkeiten sind zu unterschiedlichen Zeiten erforderlich und arbeiten als Toolkette 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.4.1
  • Profilinstallationsprogramm: androidx.profileinstaller:profileinstaller:1.4.1

Wir empfehlen, die neueste Version des Android-Gradle-Plug-ins zu verwenden, um Baseline-Profile zu erstellen und zu verwalten. Hier sind die wichtigsten Funktionen der verschiedenen Versionen des Android-Gradle-Plug-ins:

Android-Gradle-Plug-in-Version Features
9.1 Unterstützung für vollständige Source-Set-Verzeichnisse (Bibliotheksmodule): Neben variantenabhängigen Verzeichnissen können Sie mehrere Baseline-Profil-Quelldateien mit einem beliebigen Namen deklarieren, z. B. src/free/generated/baselineProfiles/baseline-prof1.txt, sowohl für Bibliotheksmodule als auch für App-Module.
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 besser mit der Produktion übereinstimmt. Dieses Update hat keine Auswirkungen auf die Produktionsleistung von Baseline-Profilen.
8.3
  • Unterstützung für teilweise Quellverzeichnisse (Bibliotheksmodule): Deklarieren Sie variantenabhängige Baseline-Profildateien wie src/free/generated/baselineProfiles/baseline-prof.txt, für Bibliotheksmodule.
  • Baseline-Profile enthalten desugared-Klassen.
8.2
  • Umschreiben von Regeln durch R8:D8 und R8 können die menschenlesbaren Baseline- und Startprofilregeln so umwandeln, dass alle Regeln erfasst werden, die Sie zur Optimierung der App-Leistung benötigen. So können Sie Profile aus einem nicht minimierten Build generieren und auf einen minimierten Release-Build anwenden. Die Baseline-Profilabdeckung von Methoden wird um etwa 30% erhöht und die App-Leistung um etwa 15 % verbessert.
  • Startprofile: Generieren Sie diesen Typ von Baseline-Profil, um das Layout von Code in DEX zu optimieren. Die Startleistung wird um weitere 15 % verbessert, bei großen Apps sogar noch mehr.
8.0 Empfohlene Mindestversion: Verwenden Sie das Baseline-Profil-Gradle-Plug-in, um Baseline-Profile mit einer einzigen Gradle-Aufgabe zu generieren.
  • Unterstützung für vollständige Quellverzeichnisse (App-Module): Deklarieren Sie mehrere Baseline-Profil-Quelldateien und verwenden Sie variantenabhängige Verzeichnisse wie src/free/generated/baselineProfiles/baseline-prof1.txt.
7.4 Unterstützte Mindestversion: Apps können Baseline-Profile aus Bibliotheken verwenden und ein eigenes Baseline-Profil in der src/main/baseline-prof.txt Datei 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 verpackt für die primäre .dex-Datei.
  • D8 und R8 unterstützen das Generieren von Startprofilen aus einem Build, bei dem isMinifyEnabled auf false gesetzt ist.

Variantenabhängige Einstellungen für die Profilquelle

Wenn Sie das Android-Gradle-Plug-in (AGP) Version 8.0 für Anwendungen und AGP Version 8.3 für Bibliotheken verwenden, können Sie Baseline-Profilregeln in einem dedizierten Quellverzeichnis platzieren. So sind Sie nicht mehr auf einen einzelnen, festen Pfad (z. B. src/main/baseline-prof.txt) beschränkt und können mehrere Dateien verwenden.

Dies erleichtert die robuste Unterstützung von Varianten, da Sie unterschiedliche Baseline-Profile definieren können, die auf bestimmte Build-Varianten und ‑Typen zugeschnitten sind (z. B. mit Verzeichnissen wie src/variant/baselineProfiles/). So wird sichergestellt, dass die Regeln zur Leistungsoptimierung genau auf jede einzelne Anwendung oder jede einzelne Bibliothek angewendet werden.

Beispiel für die Profilgenerierung

Das folgende Beispiel zeigt eine Klasse zum Erstellen eines Baseline-Profils für den App-Start sowie mehrere Navigations- und Scrollereignisse mit der empfohlenen Macrobenchmark-Bibliothek:

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

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

                // Find and click elements using the new DSL
                onElement { textAsString() == "COMPOSE LAZYLIST" }.click()
                onElement { viewIdResourceName == "myLazyColumn" }.also {
                    it.fling(Direction.DOWN)
                    it.fling(Direction.UP)
                }
                pressBack()
            }
        }
    }
}

Weitere Informationen zur Verwendung der UI Automator-Bibliothek zum Automatisieren von Nutzer pfaden finden Sie unter Automatisierte Tests mit UI Automator schreiben.

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

Inhalte

Wenn Sie Baseline-Profile in einer App verwenden, können Sie App-Startcode und gängige Nutzerinteraktionen wie die Navigation zwischen Bildschirmen oder das Scrollen einbeziehen. Sie können auch ganze Abläufe wie Registrierung, Anmeldung oder Zahlung erfassen. Alle Nutzerpfade, die Sie als kritisch betrachten, können von Baseline-Profilen profitieren, da ihre Laufzeitleistung verbessert wird.

Wenn Sie mit verschiedenen Ansätzen zur Leistungsverbesserung experimentieren, sollten Sie Baseline-Profile für beide Testverzweigungen 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 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 gängige Nutzerinteraktionen abdecken, bei denen Renderingzeit 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äre Form kompiliert. Sie finden sie unter assets/dexopt/baseline.prof. Anschließend können Sie das Android App Bundle (AAB) wie gewohnt in Google Play hochladen.

  2. Google Play verarbeitet das Profil und liefert es zusammen mit dem APK direkt an die Nutzer. Während der Installation führt ART eine AOT-Kompilierung der Methoden in dem Profil durch, wodurch diese Methoden schneller ausgeführt werden. Wenn das Profil Methoden enthält, die beim App-Start oder beim Frame-Rendering verwendet werden, können Nutzer schnellere Startzeiten und weniger Verzögerungen feststellen.

  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 Baseline-Profile vom Upload bis zur Bereitstellung für Endnutzer und wie dieser Workflow mit Cloud-Profilen zusammenhängt.

Baseline-Profile und Startprofile vergleichen

Sie verwenden das Baseline-Profil-Gradle-Plug-in, um Profildateien zu definieren und zu erstellen. Dieses Plug-in wird in den Build-Prozess eingebunden und das Android-Gradle-Plug-in kompiliert diese für Menschen lesbaren Profilregeln in ein binäres Format, das als baseline.prof im APK oder AAB verpackt ist.ART kann es effektiv für die Kompilierung auf dem Gerät verwenden, sofern es kleiner als 1,5 MB ist.

Diese Profildateien werden in der Regel startup-prof.txt und baseline-prof.txt genannt. Obwohl ihre Inhalte manchmal ähnlich erscheinen, insbesondere wenn Sie sich hauptsächlich auf den Start konzentrieren, dienen sie unterschiedlichen Zwecken und beeinflussen die Leistung in verschiedenen Phasen:

Baseline-Profil

Die Baseline-Profildatei enthält eine umfassende Reihe von Regeln, mit denen Android Runtime (ART) häufig verwendete Codepfade vorkompiliert. So wird die App-Leistung nicht nur beim Start optimiert.

Die Baseline-Profildatei ist in der Regel eine Obermenge der Regeln in Ihrem Startprofil. Diese Datei enthält alle Regeln, die für die Optimierung des App-Starts erforderlich sind (generiert über die Gradle-Aufgabe baselineProfile), sowie zusätzliche Profile für andere kritische Nutzerpfade. Beispiele sind das Scrollen und die Navigation zwischen verschiedenen Bildschirmen.

Diese zusätzlichen Regeln, die nicht den Start betreffen, werden unabhängig vom Wert des Konfigurationsfelds includeInStartupProfile generiert.

Startprofil

Die Startprofildatei enthält Regeln, die speziell für den Startpfad Ihrer App optimiert sind. Während der Kompilierung konvertiert D8 den Java-Bytecode in das DEX-Format. R8 verwendet diese Datei dann, um das Layout Ihrer DEX-Dateien zu beeinflussen. So wird sichergestellt, dass kritischer Startcode in der primären DEX-Datei platziert wird, um die Ausführung zu beschleunigen. Sie sollten includeInStartupProfile in der Regel nur für Testszenarien auf true setzen, die für die anfängliche Anzeige der App unerlässlich sind. Weitere Informationen finden Sie unter Startprofile erstellen.

Cloud-Profile

Cloud-Profile bieten zusammen mit Baseline Profilen eine zusätzliche Form der profilgestützten Optimierung (Profile Guided Optimization, PGO). Sie werden von Google Play Store aggregiert und für die Kompilierung zur Installationszeit verteilt.

Cloud-Profile basieren auf realen Nutzerinteraktionen mit der App. Es dauert jedoch mehrere Stunden bis Tage, bis sie nach einem Update verteilt werden, was ihre Verfügbarkeit einschränkt. Bis die 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 skalieren nur gut für Apps mit einer ausreichend großen Nutzerbasis.

Kompilierungsverhalten bei verschiedenen Android-Versionen

Android-Plattformversionen verwenden unterschiedliche Ansätze zur App-Kompilierung, die jeweils mit einem entsprechenden Leistungs-Trade-off verbunden sind. Baseline-Profile verbessern die 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 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 Festplattenspeichernutzung und zu längeren Zeiten zum Laden von Code von der Festplatte, was möglicherweise die Kaltstartzeiten verlängert.
7 bis 8.1 (API-Level 24 bis 27) Teilweise AOT (Baseline-Profil) Baseline-Profile werden bei der ersten Ausführung von androidx.profileinstaller 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. So werden der Festplattenspeicher und die Zeit zum Laden von Code von der Festplatte optimiert, wodurch die Wartezeit für die App verkürzt wird.
9 (API-Level 28) und höher Teilweise AOT (Baseline- + Cloud-Profil) Play verwendet Baseline-Profile während der App-Installation, um das 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 Problemumgehungen entwickelt werden:

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

  • Um Baseline-Profile für Bibliotheken erfolgreich bereitzustellen, verwenden Sie mindestens das Baseline-Profil-Gradle-Plug-in 1.2.3 oder das Android-Gradle-Plug-in 8.3 (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 im Android-Gradle-Plug-in 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 im Android-Gradle-Plug-in 8.1 behoben.

  • Nicht über den Google Play Store vertriebene Apps unterstützen möglicherweise nicht die Verwendung von Baseline-Profilen bei der Installation. 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 Testtrack jedoch schon.

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

Zusätzliche Ressourcen

Empfehlungen für Sie