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 mehrstufigen 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. Dazu analysiert R8 die Einstiegspunkte Ihrer App (z. B.
ActivitiesoderServices, die im Manifest definiert sind), erstellt ein Diagramm des referenzierten Codes und entfernt alles, was nicht referenziert wird.Logische Optimierungen: R8 schreibt Ihren Code um, um die Ausführungseffizienz zu verbessern und den Overhead zu reduzieren. Wichtige Techniken sind:
Method 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, was den Arbeitsspeicherverbrauch senkt 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 aus
com.example.MyActivitya.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 Entfernung von Ressourcen.
Optimierung aktivieren
Wenn Sie die App-Optimierung für Ihre App aktivieren möchten, verwenden Sie die entsprechende DSL-Version basierend auf der AGP-Version Ihres Projekts. Wir empfehlen, 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.
Für AGP-Versionen 9.3 und höher
So aktivieren Sie die App-Optimierung für AGP 9.3 und höher:
- Legen Sie im Block
optimizationim Build-Skript auf App-Ebene Ihres Release-Buildsenable = truefest. - Fügen Sie Ihre Keep-Regeln in einer Datei mit dem Suffix
.keepimsrc/<variant>/keepRulesSource-Set hinzu. Beispiel:src/main/keepRules/custom-rules.keep.
Kotlin
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
Groovy
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
Legacy-DSL für AGP-Versionen unter 9.3
Wenn Sie die App-Optimierung aktivieren möchten, legen Sie isMinifyEnabled = true (für die Codeoptimierung)
und isShrinkResources = true (für die Ressourcenoptimierung) im Build-Skript auf App-Ebene Ihres Release
Builds fest. Wir empfehlen, beide Einstellungen immer zu aktivieren.
Legacy-DSL (Kotlin)
android {
buildTypes {
release {
// Enables code optimizations.
isMinifyEnabled = true
// Enables resource shrinking.
isShrinkResources = true
proguardFiles(
// Default file with automatically generated optimization rules.
getDefaultProguardFile("proguard-android-optimize.txt"),
...
)
...
}
}
...
}
Legacy-DSL (Groovy)
android {
buildTypes {
release {
// Enables code optimizations.
minifyEnabled = true
// Enables resource shrinking.
shrinkResources = true
// Default file with automatically generated optimization rules.
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
...
}
}
}
R8-Optimierung verbessern
Die Leistungssteigerungen durch R8 hängen direkt davon ab, wie viel von Ihrem Code R8 optimieren kann. Um die Vorteile von R8 optimal zu nutzen, sollten Sie die Best Practices befolgen:
- R8 im vollständigen Modus aktivieren
- Verschleierung, Optimierung und Entfernung aktivieren
- Entfernung von Ressourcen und optimierte Entfernung von Ressourcen aktivieren
- Keep-Regeln verfeinern, um eine maximale Optimierung von Klassen, Feldern und Methoden zu ermöglichen.
Verwenden Sie den R8-Konfigurationsanalysator, um Keep-Regeln zu verfeinern.
Mit dem R8-Konfigurationsanalysator haben Sie folgende Möglichkeiten:
- Die allgemeine Qualität der R8-Konfiguration verfolgen und verbessern, indem Sie die Messwerte im Bericht des R8-Konfigurationsanalysators beobachten.
- Die breitesten Keep-Regeln finden – diejenigen, die die meiste Optimierung verhindern
- und verstehen, welche Optimierung sie verhindern, um sie zu verfeinern.
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.
Entfernung von Ressourcen für noch kleinere Apps optimieren
Mit der Version 8.12.0 von AGP wird die optimierte Entfernung von Ressourcen eingeführt, mit der die Ressourcen- und Codeoptimierung integriert werden soll, um noch kleinere und schnellere Apps zu erstellen. Vor der optimierten Entfernung von Ressourcen hat das Android Asset Packaging Tool (AAPT2) Keep-Regeln generiert, die die Entfernung von Ressourcen effektiv getrennt vom Code behandelt haben. Dadurch wurden oft nicht zugänglicher Code oder Ressourcen beibehalten, die aufeinander verwiesen haben.
Bei der optimierten Entfernung von Ressourcen 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 Entfernung von Ressourcen aktivieren
Wenn Sie die neue optimierte Pipeline für die Entfernung von Ressourcen für AGP 8.12 oder 8.13 aktivieren möchten, fügen Sie der Datei gradle.properties Ihres Projekts Folgendes hinzu:
Wenn Sie AGP 9.0.0 oder eine neuere Version verwenden, müssen Sie android.r8.optimizedResourceShrinking=true nicht festlegen. Die optimierte Entfernung von Ressourcen 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:
bash 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.
- Nehmen Sie Optimierungen schrittweise vor.
- 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.
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.3 |
Vereinfachte DSL:Der neue Block `optimization {}` erfordert weniger Konfiguration. Die optimierte Entfernung von Ressourcen ist immer aktiviert. Die Standard-Keep-Regeln für Android sind optional.
Source-Set`keepRules`: Wenn Sie die neue DSL verwenden, müssen Sie Ihre Keep-Regeln im src/<variant>/keepRules Source-Set in Dateien mit dem Suffix .keep platzieren. Die Quellsätze sind auch mit der Legacy-DSL kompatibel.
KMP-Regeln (Kotlin MultiPlatform) für Nutzer: Für KMP muss publish = true nicht mehr festgelegt werden und der Source-Set src/<variant>/keepRules mit der Erweiterung .keep wird unterstützt.
Die Legacy-DSL wird weiterhin unterstützt. |
| 9.1 |
Klassen standardmäßig neu verpackt:R8 verpackt Klassen neu (verschiebt sie in das unbenannte Paket auf der obersten Ebene), um DEX weiter zu komprimieren. Die Option -repackageclasses muss nicht mehr angegeben werden. Informationen zur Funktionsweise und zum Deaktivieren finden Sie unter Globale Optionen.
|
| 9.0 |
Optimierte Entfernung von Ressourcen: Standardmäßig aktiviert (mit android.r8.optimizedResourceShrinking gesteuert). Die optimierte Entfernung von Ressourcen trägt dazu bei, die Entfernung von Ressourcen 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 Formfaktor-Vertikalen 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 (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 Entfernung von Ressourcen: Erste Unterstützung hinzugefügt (mit android.r8.optimizedResourceShrinking gesteuert). Die optimierte Entfernung von Ressourcen trägt dazu bei, die Entfernung von Ressourcen in die Codeoptimierungspipeline zu integrieren. In dieser Version von AGP müssen Sie sie manuell aktivieren.Logcat-Retracing: Unterstützung für automatisches Retracing im Android Studio Logcat-Fenster. |
| 8.6 |
Verbessertes Retracing:Enthält standardmäßig das Retracing von Dateinamen und Zeilennummern für alle minSdk-Ebenen (zuvor war minSdk 26+ in Version 8.2 erforderlich).Wenn Sie R8 aktualisieren, sind Stacktraces aus verschleierten Builds leichter und klarer lesbar. In dieser Version wird die Zuordnung von Zeilennummern und Quelldateien verbessert, sodass Tools wie Android Studio Logcat Abstürze leichter 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, aber möglicherweise sind zusätzliche Keep-Regeln erforderlich, um zu verhindern, dass notwendiger Code entfernt wird.
|