Android-Skills
Auf GitHub ansehenR8-Konfigurationsanalysetool
android skills add --skill r8-analyzerAnalyze the R8 configurationDas R8-Konfigurationsanalysetool bietet detaillierte Einblicke in die Qualität der Konfiguration Ihrer App, damit Sie die Leistungsvorteile von R8 optimal nutzen können. Sie können die R8-Optimierung verfolgen und verbessern, indem Sie wichtige Messwerte beobachten, insbesondere die Werte für die Komprimierung, Optimierung und Verschleierung. Diese geben den Prozentsatz Ihrer Codebasis an, der für die Optimierung verfügbar ist. Das Analysetool identifiziert allgemeine oder unnötige Keep-Regeln, einschließlich derer, die von Drittanbieterbibliotheken eingeführt wurden. So können Sie Ihre Konfiguration verfeinern und sicherstellen, dass R8 so viele Ihrer Klassen, Felder und Methoden wie möglich effektiv optimieren kann.
Bericht generieren
Mit AGP 9.3.0 und höher können Sie den Bericht des R8-Konfigurationsanalysetools mit einer separaten Gradle-Aufgabe oder automatisch während eines R8-Builds generieren.
Separate Gradle-Aufgabe ausführen (für die lokale Verwendung empfohlen)
Wenn Sie aktiv an Keep-Regeln arbeiten, können Sie mit der separaten Gradle-Aufgabe die Auswirkungen Ihrer Änderungen schnell bewerten, ohne das APK oder Bundle vollständig zu erstellen:
./gradlew :app:analyzeReleaseR8Config
Da bei dieser Aufgabe die APK- oder Bundle-Generierung übersprungen wird, ist die Feedbackschleife viel kürzer. So können Sie schnell analysieren, wie sich Ihre Keep-Regeln auf die Werte für Komprimierung, Optimierung und Verschleierung auswirken, und sie sofort verfeinern. Der HTML-Bericht wird unter app/build/reports/r8/r8-config-analyzer-release.html generiert.
Automatisch bei regulären Builds generieren
Wenn Sie einen vollständigen R8-Release-Build ausführen (z. B. assembleRelease), wird der Bericht automatisch unter build/outputs/mapping/release/configanalyzer.html generiert.
Wenn Sie die automatische Generierung der Ausgaben bei regulären Builds deaktivieren möchten, legen Sie die folgende Gradle-Property fest:
android.experimental.r8.enableR8ConfigurationAnalyzer=false
Für AGP 9.2 und früher
Für AGP 9.2 und früher aktualisieren Sie Ihre lokale Kopie von R8 auf die neueste Version, indem Sie sie als Klassenpfadabhängigkeit zur Datei settings.gradle oder
settings.gradle.kts Ihres Projekts hinzufügen:
pluginManagement {
repositories {
google()
mavenCentral()
}
buildscript {
dependencies {
// Update to a more recent R8 version.
classpath("com.android.tools:r8:9.4.14")
}
}
}
Dabei wird die neueste Version von R8 einschließlich des neuesten Konfigurationsanalysetools verwendet. Dies ist nur vorübergehend erforderlich, wenn Sie Ihre R8-Konfiguration analysieren.
Jetzt können Sie die Systemeigenschaft com.android.tools.r8.dumpkeepradiushtmltodirectory festlegen, wenn Sie eine Gradle-Aufgabe mit einem Build ausführen, der mit R8 aktiviert wurde.
./gradlew assembleRelease \
-Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>
Mit dem folgenden Befehl können Sie beispielsweise den HTML-Bericht im Verzeichnis /tmp/r8analysis generieren:
# To create the /tmp/r8analysis folder.
mkdir -p /tmp/r8analysis
# To generate the report in the /tmp/r8analysis folder.
./gradlew assembleRelease \
-Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=/tmp/r8analysis
Bericht auswerten
Das R8-Konfigurationsanalysetool bietet Einblicke in die R8-Konfiguration Ihrer App und die Auswirkungen der einzelnen Keep-Regeln auf Ihre App. So können Sie die Optimierung durch R8 maximieren und die Leistung Ihrer App verbessern. Anhand der folgenden Werte können Sie nachvollziehen, wie viel von Ihrer Codebasis von R8 optimiert werden kann.
Wert für die Komprimierung
Wenn R8 Ihre App komprimiert, wird die Gesamtgröße Ihrer App reduziert, indem nicht verwendeter Code und nicht verwendete Ressourcen ermittelt und entfernt werden. So wird sichergestellt, dass Ihr endgültiger Build so schlank wie möglich ist. Der Wert für die Komprimierung gibt den Prozentsatz der Klassen, Felder und Methoden an, die komprimiert werden. Ein Wert von 66% bedeutet beispielsweise, dass R8 66% Ihrer Codebasis komprimieren kann.
Optimierungsfaktor
R8 führt Optimierungen wie das Inlining von Methoden und das Zusammenführen von Klassen durch, was zu Verbesserungen beim Start und beim Arbeitsspeicher Ihrer App führt. Der Optimierungsfaktor gibt den Prozentsatz der Klassen, Felder und Methoden an, die von R8 optimiert werden. Wenn der Optimierungsfaktor beispielsweise 66 % beträgt, kann R8 nur 66% Ihrer Codebasis optimieren.
Verschleierungswert
Durch das Verschleiern von Klassen, Feldern und Methoden in kürzere Namen reduziert R8 den Metadaten-Footprint der App, um Arbeitsspeicher zu sparen. Der Verschleierungswert gibt den Prozentsatz des Codes an, der in Ihrer Codebasis verschleiert werden kann.
Keep-Regeln verfeinern
Um die Werte zu verbessern und eine bessere R8-Optimierung zu ermöglichen, sollten Sie Ihre Keep-Regeln verfeinern, damit sie R8 nicht unnötig daran hindern, Ihre App zu optimieren. Sie sollten nur Klassen, Methoden oder Felder beibehalten, auf die über die Reflektion zugegriffen wird.
Verwenden Sie dazu die Keep-Regel-Analyse.
Wenn Sie die detaillierte Analyse einer Regel sehen möchten, klicken Sie darauf, um den Bildschirm mit den Details zu öffnen.
Keep-Regeln verfeinern
So verfeinern Sie Ihre Keep-Regeln und nutzen das volle Potenzial der R8-Optimierungen für Ihre App:
- Für jede Keep-Regel sehen Sie im Konfigurationsanalysetool den Prozentsatz der Klassen, Felder und Methoden, die von R8 nicht optimiert werden können. So können Sie die Keep-Regeln ermitteln, die die Optimierung in einer großen Anzahl von Klassen, Feldern oder Methoden verhindern. Außerdem werden die Optimierungseigenschaften aufgeführt, die durch die einzelnen Keep-Regeln verhindert werden.
- Wenn Sie eine Keep-Regel sehen, die die Optimierung einer großen Anzahl von Klassen verhindert, sollten Sie prüfen, welche Klassen, Felder und Methoden durch die Keep-Regel nicht optimiert werden können. So können Sie feststellen, ob diese Regel Elemente beibehält, die nicht dynamisch über die Reflektion aufgerufen werden.
- Reduzieren Sie die durch Keep-Regeln blockierte Optimierung, indem Sie nur die erforderlichen Klassen, Felder oder Methoden auswählen. Wählen Sie dazu die richtige Keep-Option aus und folgen Sie den Best Practices.
- Untersuchen Sie die betroffenen Klassen, Felder und Methoden der Keep-Regel und führen Sie Tests durch. Verfeinern Sie dann die Keep-Regeln.
Optimierung von Bibliotheken prüfen
Wenn Sie Drittanbieterbibliotheken einbinden, enthalten diese oft eigene Keep-Regeln für die Verwendung mit R8. Da der Bibliotheksautor Ihre spezifische Implementierung nicht vorhersagen kann, schreibt er manchmal konservative, weitreichende Regeln, die die Optimierung in mehr Klassen, Feldern und Methoden verhindern als nötig. So kann R8 möglicherweise Teile Ihrer App nicht optimieren, die nichts mit der tatsächlichen Laufzeitausführung der Bibliothek zu tun haben. Mit dem R8-Konfigurationsanalysetool können Sie Bibliotheken ermitteln, die Regeln einführen, die sich negativ auf die Optimierung Ihrer App auswirken.
Mit dem Konfigurationsanalysetool können Sie die kombinierte Wirkung aller zusammengeführten Keep-Regeln für Nutzer prüfen. Wenn Sie die Auswirkungen der einzelnen Keep-Regeln aus einer Drittanbieterbibliothek analysieren, können Sie die spezifischen Drittanbieterbibliotheken ermitteln und nachverfolgen, die eine hohe Optimierung in Ihrer App verhindern.
Bibliotheken optimieren
So gehen Sie mit Keep-Regeln um, die von Drittanbieterbibliotheken eingeführt wurden:
- Wenn eine Bibliothek eine zu allgemeine Regel enthält, empfehlen wir Ihnen, sich mit den Daten aus Ihrem Bericht an den Verantwortlichen der Bibliothek zu wenden, um zu zeigen, wie sich die aktuellen Regeln auf die Optimierungswerte Ihrer App auswirken. Wenn es sich um eine externe Bibliothek handelt, suchen Sie nach vorhandenen Fehlern in der Bibliothek, bevor Sie Probleme melden.
- Bei Bedarf können Sie potenzielle Verbesserungen testen, indem Sie Regeln aus einer bestimmten Bibliothek herausfiltern. Sie können die Regeln der Bibliothek in Ihr Projekt importieren, die allgemeinen Regeln ausschließen und das Konfigurationsanalysetool noch einmal ausführen, um die potenziellen Verbesserungen bei Größe und Leistung zu messen.
Subsumierte Regeln
Es kann vorkommen, dass sich mehrere Keep-Regeln überschneiden und eine der Regeln mehr Optimierung verhindert als nötig. Wenn sich in Ihrer Codebasis zwei Keep-Regeln befinden,
# Prevents optimization in the entire package
# Remove this to improve optimization
-keep class com.example.package.** { *; }
# Prevents optimization to the class inside the package
-keep class com.example.package.Myclass
subsumiert die erste Keep-Regel, die die Optimierung im gesamten Paket verhindert, die zweite Keep-Regel, die auf eine Klasse innerhalb des Pakets abzielt, das von der ersten Keep-Regel beibehalten wird. Wenn sich Keep-Regeln überschneiden, kann eine mehr Optimierungen blockieren als erforderlich. Wenn Sie diese sich überschneidenden Regeln verfeinern, können Sie die R8-Optimierung maximieren und technische Schulden abbauen. Dazu müssen Sie Ihre Konfiguration optimieren, damit nur der wesentliche Code beibehalten wird und das volle Potenzial der R8-Optimierungsfunktionen genutzt werden kann.
Subsumierte Regeln optimieren
- Suchen Sie mit dem R8-Konfigurationsanalysetool nach subsumierenden Keep-Regeln.
- Ermitteln Sie die genauen Klassen, Felder oder Methoden in Ihrer Codebasis, die tatsächlich auf die Reflektion angewiesen sind und mit Keep-Regeln beibehalten werden müssen. So können Sie die Keep-Regeln verfeinern.
- Vergleichen Sie mit dem Konfigurationsanalysetool die Auswirkungen der einzelnen Regeln, die auf dieselben Klassen, Felder oder Methoden abzielen. Anhand des Prozentsatzes der durch die einzelnen Keep-Regeln verhinderten Optimierung können Sie ermitteln, welche Regel allgemeiner und welche spezifischer ist.
- Wenn die spezifische Regel genau geschrieben ist und nur die genauen Elemente oder Klassen beibehält, auf die reflektiv zugegriffen wird, entfernen Sie die allgemeinere Keep-Regel. So können R8-Optimierungen für den Rest Ihres Pakets sicher freigegeben werden.
- Wenn die allgemeine Regel auf die richtigen Klassen abzielt, behalten Sie die allgemeine Regel bei und löschen Sie die spezifische Regel. Die spezifische Regel ist nur unnötiger Ballast. Verfeinern Sie die allgemeine Regel so, dass sie nur auf die von Ihnen ermittelten Klassen, Felder oder Methoden abzielt.
Änderungen überprüfen und testen: Führen Sie das Konfigurationsanalysetool noch einmal aus, um sicherzustellen, dass der Konflikt behoben ist. Kompilieren Sie dann einen Release-Build und testen Sie Ihre Änderungen, um sicherzustellen, dass die Codebasis wie erwartet funktioniert.
Unnötige Regeln entfernen
Mit dem Konfigurationsanalysetool können Sie Ihre Codebasis systematisch prüfen, um veraltete Keep-Regeln zu ermitteln und zu entfernen, die Ihre Konfiguration überladen. Das R8-Konfigurationsanalysetool hebt insbesondere zwei Hauptquellen für unnötige Regeln hervor:
- Nicht verwendete Regeln: Regeln, die in Ihrem aktuellen Build mit keinen Klassen, Methoden oder Feldern übereinstimmen. Sie bleiben oft nach dem Refactoring von Code, dem Entfernen von Abhängigkeiten oder aus Copy-and-Paste-Konfigurationen bestehen, die nicht mehr relevant sind. So wird die Konfiguration unnötig komplex.
- Identische Regeln: Identische Keep-Regeln sind Regeln, die auf dieselben Klassen, Felder und Methoden abzielen, oder doppelte Deklarationen von Keep-Regeln in derselben oder in verschiedenen Keep-Regel-Dateien.
Beide Arten von Regeln überladen Ihre Konfiguration und erschweren die Wartung und Fehlerbehebung. Wenn Sie diese Regeln ermitteln, können Sie Ihre Konfiguration bereinigen.