R8 Configuration Analyzer verwenden

Der R8 Configuration Analyzer ist ein Tool, mit dem Sie die Leistungssteigerungen durch R8 maximieren können. Es bietet detaillierte Einblicke in die Qualität der Konfiguration Ihrer App. Sie können die R8-Optimierung verfolgen und verbessern, indem Sie wichtige Messwerte beobachten, insbesondere die Werte für die Entfernung von Ressourcen, die Optimierung und die Verschleierung. Diese Werte geben den Prozentsatz Ihrer Codebasis an, der für die Optimierung verfügbar ist. Durch die Identifizierung allgemeiner oder unnötiger Keep-Regeln, einschließlich derer, die durch Bibliotheken von Drittanbietern eingeführt wurden, hilft Ihnen der Analyzer, Ihre Konfiguration zu verfeinern. So kann R8 so viele Ihrer Klassen, Felder und Methoden wie möglich effektiv optimieren.

Bericht erstellen

Mit AGP 9.3.0 und höher können Sie den Bericht des R8 Configuration Analyzer mit einer separaten Gradle-Aufgabe oder automatisch während eines R8-Builds erstellen.

Separate Gradle-Aufgabe ausführen (empfohlen für die lokale Verwendung)

Wenn Sie aktiv an Keep-Regeln arbeiten, verwenden Sie die separate Gradle-Aufgabe, um die Auswirkungen Ihrer Änderungen schnell zu 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 die Entfernung von Ressourcen, die Optimierung und die Verschleierung auswirken, und sie sofort verfeinern. Der HTML-Bericht wird unter app/build/reports/r8/r8-config-analyzer-release.html erstellt.

Automatisch bei regulären Builds erstellen

Wenn Sie einen vollständigen R8-Release-Build ausführen (z. B. assembleRelease), wird der Bericht automatisch unter build/outputs/mapping/release/configanalyzer.html erstellt. 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 niedriger

Legen Sie für AGP 9.2 und niedriger die com.android.tools.r8.dumpkeepradiushtmltodirectory Systemeigenschaft fest, wenn Sie eine Gradle-Aufgabe mit einem Build ausführen, bei dem R8 aktiviert ist.

./gradlew assembleRelease \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>

Verwenden Sie beispielsweise den folgenden Befehl, um den HTML-Bericht im Verzeichnis /tmp/r8analysis zu erstellen:

# 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

Der R8 Configuration Analyzer 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.

Beispiel für den Abschnitt „Berichtszusammenfassung“
Abbildung 1. Beispiel für den Abschnitt „Berichtszusammenfassung“

Wert für die Entfernung von Ressourcen

Wenn R8 Ihre App verkleinert, wird die Gesamtgröße Ihrer App reduziert, indem ungenutzter Code und ungenutzte Ressourcen identifiziert und entfernt werden. So ist Ihr endgültiger Build so schlank wie möglich. Der Wert für die Entfernung von Ressourcen gibt den Prozentsatz der Klassen, Felder und Methoden an, die verkleinert werden. Ein Wert von 66% bedeutet beispielsweise, dass R8 66% Ihrer Codebasis verkleinern kann.

Optimierungsfaktor

R8 führt Optimierungen wie das Inlining von Methoden und das Zusammenführen von Klassen durch, wodurch sich der Start und die Speichernutzung Ihrer App verbessern. 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 die Verschleierung von Klassen, Feldern und Methoden in kürzere Namen reduziert R8 den Metadaten-Footprint der App, um Speicher 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 Reflection zugegriffen wird.

Verwenden Sie dazu die Keep-Regel-Analyse.

Beispiel für die Analyse von Aufbewahrungsregeln
Abbildung 2. Beispiel für 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.

Beispiel für die Analyse von Aufbewahrungsregeln
Abbildung 3. Beispiel für die Keep-Regel-Analyse

Keep-Regeln verfeinern

So verfeinern Sie Ihre Keep-Regeln und nutzen das volle Potenzial der R8-Optimierungen für Ihre App:

  1. Im Configuration Analyzer sehen Sie für jede Keep-Regel den Prozentsatz der Klassen, Felder und Methoden, die von R8 nicht optimiert werden können. So können Sie die Keep-Regeln identifizieren, die die Optimierung 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.
  2. 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 Reflection aufgerufen werden.
  3. 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.
  4. 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 Bibliotheken von Drittanbietern 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 Configuration Analyzer können Sie Bibliotheken identifizieren, die Regeln einführen, die sich negativ auf die Optimierung Ihrer App auswirken.

Verwenden Sie den Configuration Analyzer, um die kombinierte Wirkung aller zusammengeführten Keep-Regeln für Verbraucher zu prüfen. Wenn Sie die Auswirkungen jeder Keep-Regel aus einer Bibliothek von Drittanbietern analysieren, können Sie die spezifischen Bibliotheken von Drittanbietern identifizieren und nachverfolgen, die eine hohe Optimierung in Ihrer App verhindern.

Bibliotheken optimieren

So gehen Sie mit Keep-Regeln um, die durch Bibliotheken von Drittanbietern 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 den Configuration Analyzer noch einmal ausführen, um die potenziellen Verbesserungen in Bezug auf 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

Die erste Keep-Regel, die die Optimierung im gesamten Paket verhindert, subsumiert die zweite Keep-Regel, die auf eine Klasse im Paket abzielt, die von der ersten Keep-Regel beibehalten wird. Wenn sich Keep-Regeln überschneiden, kann eine mehr Optimierungen blockieren als erforderlich. Durch die Verfeinerung dieser sich überschneidenden Regeln können Sie die R8-Optimierung maximieren und technische Schulden abbauen. Dabei wird Ihre Konfiguration optimiert, damit nur der wesentliche Code beibehalten wird und das volle Potenzial der Optimierungsfunktionen von R8 genutzt werden kann.

Beispiel für den Abschnitt „Berichtszusammenfassung“
Abbildung 4. Beispiel für subsumierte Regeln im Bericht

Subsumierte Regeln optimieren

  1. Suchen Sie mit dem R8 Configuration Analyzer nach den subsumierenden Keep-Regeln.
  2. Identifizieren Sie die genauen Klassen, Felder oder Methoden in Ihrer Codebasis, die tatsächlich auf Reflection angewiesen sind und mit Keep-Regeln beibehalten werden müssen. So können Sie die Keep-Regeln verfeinern.
  3. Vergleichen Sie mit dem Configuration Analyzer die Auswirkungen der einzelnen Regeln, die auf dieselben Klassen, Felder oder Methoden abzielen. Sie können den Prozentsatz der Optimierung verwenden, die durch die einzelnen Keep-Regeln verhindert wird, um zu ermitteln, welche Regel allgemeiner und welche spezifischer ist.
    1. Wenn die spezifische Regel genau geschrieben ist und nur die genauen Elemente oder Klassen beibehält, auf die über Reflection zugegriffen wird, entfernen Sie die allgemeinere Keep-Regel. So können R8-Optimierungen für den Rest Ihres Pakets sicher genutzt werden.
    2. 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 identifizierten Klassen, Felder oder Methoden abzielt.

Änderungen prüfen und testen: Führen Sie den Configuration Analyzer noch einmal aus, um zu prüfen, ob der Konflikt behoben wurde. 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 Configuration Analyzer können Sie Ihre Codebasis systematisch prüfen, um veraltete Keep-Regeln zu identifizieren und zu entfernen, die Ihre Konfiguration überladen. Der R8 Configuration Analyzer 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 der Codeumgestaltung, dem Entfernen von Abhängigkeiten oder aus Copy-and-Paste-Konfigurationen bestehen, die nicht mehr relevant sind, und erhöhen die Komplexität der Konfiguration unnötig.
  • 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 identifizieren, können Sie Ihre Konfiguration bereinigen.