Für die bestmögliche Nutzererfahrung sollten Sie Ihre App so optimieren, dass sie so klein und schnell wie möglich ist. Unser App-Optimierungstool R8 optimiert Ihre App, indem es nicht verwendeten Code und nicht verwendete Ressourcen entfernt, Code umschreibt, um die Laufzeitleistung zu optimieren, und vieles mehr. Für Ihre Nutzer bedeutet das:
- App startet schneller
- Arbeitsspeichernutzung reduziert
- Verbesserte Rendering- und Laufzeitleistung
- Weniger ANRs
Übersicht über die R8-Optimierung
R8 verwendet einen mehrphasigen Prozess, um Ihre App in Bezug auf Größe und Geschwindigkeit zu optimieren. Wichtige Vorgänge sind:
Codekomprimierung (auch Tree Shaking genannt): R8 identifiziert und entfernt nicht erreichbaren Code aus Ihrer Anwendung und ihren Bibliotheksabhängigkeiten. Durch die Analyse der Einstiegspunkte Ihrer App (z. B.
ActivitiesoderServices, die im Manifest definiert sind) erstellt R8 ein Diagramm des referenzierten Codes und entfernt alles, worauf nicht verwiesen wird.Logische Optimierungen: R8 schreibt Ihren Code um, um die Ausführungseffizienz zu verbessern und den Overhead zu reduzieren. Wichtige Techniken sind:
Methoden-Inlining: R8 ersetzt eine Methodenaufrufstelle durch den tatsächlichen Text der aufgerufenen Methode. Dadurch wird der Overhead eines Funktionsaufrufs vermieden und R8 kann weitere Optimierungen durchführen.
Klassenzusammenführung: R8 kombiniert Gruppen von Klassen und Schnittstellen zu einer einzigen Klasse. Dadurch wird die Anzahl der Klassen in der App reduziert, der Arbeitsspeicher wird weniger belastet und die Startgeschwindigkeit verbessert.
Verschleierung (auch Reduzierung genannt): Um die Größe der DEX Datei zu reduzieren, kürzt R8 die Namen von Klassen, Feldern und Methoden (z. B. kann
com.example.MyActivityzua.b.awerden).
Seit Version 8.12.0 des Android-Gradle-Plug-ins (AGP) optimiert R8 auch Ressourcen im Rahmen seiner Optimierungsphasen. Weitere Informationen finden Sie unter Optimierte Ressourcenkomprimierung.
Optimierung aktivieren
Wenn Sie die App-Optimierung aktivieren möchten, legen Sie isMinifyEnabled = true (für die Codeoptimierung)
und isShrinkResources = true (für die Ressourcenoptimierung) in Ihrem Release
Build's Build-Skript auf App-Ebene fest, wie im folgenden Code gezeigt. Wir empfehlen, beide Einstellungen immer zu aktivieren. Außerdem empfehlen wir, die App-Optimierung nur in der endgültigen Version Ihrer App zu aktivieren, die Sie vor der Veröffentlichung testen – in der Regel Ihr Release-Build. Die Optimierungen verlängern die Build-Zeit Ihres Projekts und können das Debugging erschweren, da sie den Code ändern.
Kotlin
android { buildTypes { release { // Enables code-related app optimization. isMinifyEnabled = true // Enables resource shrinking. isShrinkResources = true proguardFiles( // Default file with automatically generated optimization rules. getDefaultProguardFile("proguard-android-optimize.txt"), ... ) ... } } ... }
Groovy
android { buildTypes { release { // Enables code-related app optimization. minifyEnabled = true // Enables resource shrinking. shrinkResources = true // Default file with automatically generated optimization rules. proguardFiles getDefaultProguardFile('proguard-android-optimize.txt') ... } } }
Ressourcenkomprimierung für noch kleinere Apps optimieren
Mit Version 8.12.0 des Android-Gradle-Plug-ins (AGP) wird die optimierte Ressourcenkomprimierung eingeführt, mit der Ressourcen- und Codeoptimierung integriert werden sollen, um noch kleinere und schnellere Apps zu erstellen.
Vor der optimierten Ressourcenkomprimierung hat das Android Asset Packaging Tool (AAPT2) Keep-Regeln generiert, bei denen die Ressourcenkomprimierung getrennt vom Code behandelt wurde. Dadurch wurden häufig nicht zugänglicher Code oder Ressourcen beibehalten, die aufeinander verwiesen haben.
Bei der optimierten Ressourcenkomprimierung werden Ressourcen als Teil des Programmcodes betrachtet und bilden das Referenzdiagramm. Wenn auf eine Sammlung von Code oder Ressourcen nicht verwiesen wird, ist sie nicht durch eine Keep-Regel geschützt und kann entfernt werden.
Optimierte Ressourcenkomprimierung aktivieren
Wenn Sie die neue optimierte Ressourcenkomprimierungspipeline für AGP 8.12 oder 8.13 aktivieren möchten, fügen Sie der Datei gradle.properties Ihres Projekts Folgendes hinzu:
android.r8.optimizedResourceShrinking=true
Wenn Sie AGP 9.0.0 oder eine neuere Version verwenden, müssen Sie android.r8.optimizedResourceShrinking=true nicht festlegen. Die optimierte Ressourcenkomprimierung wird automatisch angewendet, wenn isShrinkResources = true in Ihrer Build-Konfiguration aktiviert ist.
R8-Optimierungseinstellungen überprüfen und konfigurieren
Damit R8 seine vollständigen Optimierungsfunktionen nutzen kann, entfernen Sie die
folgende Zeile aus der Datei gradle.properties Ihres Projekts, falls sie vorhanden ist:
android.enableR8.fullMode=false # Remove this line from your codebase.
Wenn Sie die App-Optimierung aktivieren, sind Stacktraces schwer zu verstehen, insbesondere wenn R8 Klassen- oder Methodennamen umbenennt. Informationen zum Abrufen von Stacktraces, die Ihrem Quellcode entsprechen, finden Sie unter Original-Stacktrace wiederherstellen.
Wenn R8 aktiviert ist, sollten Sie auch Startprofile erstellen, um die Startleistung noch weiter zu verbessern.
Wenn Sie die App-Optimierung aktivieren und dadurch Fehler auftreten, können Sie sie mit den folgenden Strategien beheben:
- Fügen Sie Keep-Regeln hinzu, um zu verhindern, dass bestimmter Code geändert wird.
- Übernehmen Sie Optimierungen schrittweise.
- Aktualisieren Sie Ihren Code, um Bibliotheken zu verwenden, die besser für die Optimierung geeignet sind.
Wenn Sie die Build-Geschwindigkeit optimieren möchten, finden Sie unter Konfigurieren, wie R8 ausgeführt wird Informationen zum Konfigurieren von R8 basierend auf Ihrer Umgebung.
R8-Optimierung verbessern
Die Leistungssteigerungen durch R8 hängen direkt davon ab, wie viel von Ihrer Codebasis R8 optimieren kann. Um die Vorteile von R8 optimal zu nutzen, aktivieren Sie R8 im vollständigen Modus und optimieren Sie die Keep-Regeln, um eine maximale Optimierung von Klassen, Feldern und Methoden zu ermöglichen.Verwenden Sie dazu den R8-Konfigurationsanalysator.
Mit dem R8-Konfigurationsanalysator haben Sie folgende Möglichkeiten:
- Sie können die Qualität der R8-Gesamtkonfiguration verfolgen und verbessern, indem Sie die Messwerte im Bericht des R8-Konfigurationsanalysators beobachten.
- Sie können die breitesten Keep-Regeln finden, die die meisten Optimierungen verhindern.
- Sie können nachvollziehen, welche Optimierungen sie verhindern, um sie zu optimieren.
Der R8-Konfigurationsanalysator ist in AGP-Version 9.3.0-alpha05 oder ab R8-Version 9.3.7-dev verfügbar. Weitere Informationen finden Sie unter R8-Konfiguration analysieren.
Verhaltensänderungen bei AGP- und R8-Versionen
In der folgenden Tabelle sind die wichtigsten Funktionen aufgeführt, die in verschiedenen Versionen des Android-Gradle-Plug-ins (AGP) und des R8-Compilers eingeführt wurden.
| AGP-Version | Eingeführte Funktionen |
|---|---|
| 9.1 |
Klassen werden standardmäßig neu verpackt:R8 verpackt Klassen neu (verschiebt sie in das unbenannte Paket auf der obersten Ebene), um DEX weiter zu komprimieren. Dadurch ist es nicht mehr erforderlich, die Option -repackageclasses anzugeben. Informationen zur Funktionsweise und zum Deaktivieren finden Sie unter Globale Optionen.
|
| 9.0 |
Optimierte Ressourcenkomprimierung:Standardmäßig aktiviert (wird mit android.r8.optimizedResourceShrinking gesteuert). Die optimierte Ressourcenkomprimierung trägt dazu bei, die Ressourcenkomprimierung in die Codeoptimierungspipeline zu integrieren, was zu kleineren und schnelleren Apps führt. Durch die gleichzeitige Optimierung von Code- und Ressourcenreferenzen werden Ressourcen identifiziert und entfernt, auf die ausschließlich von nicht verwendetem Code verwiesen wird. Das ist eine erhebliche Verbesserung gegenüber den bisherigen separaten Optimierungsprozessen.Das ist besonders nützlich für Apps, die erhebliche Ressourcen und Code über verschiedene Formfaktoren hinweg gemeinsam nutzen. Hier wurden Verbesserungen der App-Größe von über 50% gemessen. Die resultierende Größenreduzierung führt zu kleineren Downloads, schnelleren Installationen und einer besseren Nutzererfahrung mit schnellerem Start, verbessertem Rendering und weniger ANRs. Regelfilterung für Bibliotheken:Die Unterstützung für globale Optionen (z. B. -dontobfuscate) in Regeln für Bibliotheksnutzer wurde eingestellt und Apps filtern sie heraus. Weitere Informationen finden Sie unter Globale Optionen hinzufügen.Kotlin-Nullprüfungen:Standardmäßig optimiert (wird mit -processkotlinnullchecks gesteuert). In dieser Version wurden auch erhebliche Verbesserungen bei der Build-Geschwindigkeit eingeführt. Weitere Informationen finden Sie unter Globale Optionen für zusätzliche Optimierung.Bestimmte Pakete optimieren:Mit packageScope können Sie bestimmte Pakete optimieren. Dies ist eine experimentelle Funktion. Weitere Informationen finden Sie unter Bestimmte Pakete mit packageScope.Standardmäßig optimiert:Die Unterstützung für getDefaultProguardFile("proguard-android.txt") wurde eingestellt, da sie -dontoptimize enthält, was vermieden werden sollte. Verwenden Sie stattdessen "proguard-android-optimize.txt". Wenn Sie die Optimierung in Ihrer App global deaktivieren müssen, fügen Sie das Flag manuell zu einer ProGuard-Datei hinzu.
|
| 8.12 |
Optimierte Ressourcenkomprimierung: Erste Unterstützung hinzugefügt (wird mit android.r8.optimizedResourceShrinking gesteuert). Die optimierte Ressourcenkomprimierung trägt dazu bei, die Ressourcenkomprimierung in die Codeoptimierungspipeline zu integrieren. Sie müssen sie in dieser Version von AGP manuell aktivieren.Logcat-Retracing: Unterstützung für automatisches Retracing im Android Studio Logcat-Fenster. |
| 8.6 |
Verbessertes Retracing:Umfasst standardmäßig das Retracing von Dateinamen und Zeilennummern für alle minSdk-Ebenen (zuvor war minSdk 26+ in Version 8.2 erforderlich).Durch die Aktualisierung von R8 wird sichergestellt, dass Stacktraces aus verschleierten Builds einfach und klar lesbar sind. In dieser Version wurde die Zuordnung von Zeilennummern und Quelldateien verbessert, sodass Tools wie Android Studio Logcat Abstürze einfacher automatisch zum ursprünglichen Quellcode zurückverfolgen können. |
| 8.0 |
Standardmäßig vollständiger Modus: Der vollständige Modus von R8 bietet eine deutlich leistungsstärkere Optimierung. Sie ist standardmäßig aktiviert. Sie können sie mit android.enableR8.fullMode=false deaktivieren.
|
| 7.0 |
Vollständiger Modus verfügbar:Als optionale Funktion mit android.enableR8.fullMode=true eingeführt. Der vollständige Modus wendet leistungsstärkere Optimierungen an, indem er strengere Annahmen darüber trifft, wie Ihr Code Reflexion und andere dynamische Funktionen verwendet. Dadurch wird die App-Größe reduziert und die Leistung verbessert. Möglicherweise sind jedoch zusätzliche Keep-Regeln erforderlich, um zu verhindern, dass notwendiger Code entfernt wird.
|