R8 Configuration Analyzer verwenden

Der R8 Configuration Analyzer ist ein Tool, mit dem Sie die Leistungssteigerungen von R8 maximieren können. Es bietet detaillierte Einblicke in die Konfigurationsqualität Ihrer App. Sie können die R8-Optimierung verfolgen und verbessern, indem Sie wichtige Messwerte beobachten, insbesondere die Werte für die Reduzierung, Optimierung und Verschleierung. Diese 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 Drittanbieterbibliotheken eingeführt wurden, hilft Ihnen der Analyzer, Ihre Konfiguration zu verfeinern. So kann R8 so viele Klassen, Felder und Methoden wie möglich effektiv optimieren.

Bericht erstellen

In AGP 9.3.0-alpha05 und höher wird der Bericht automatisch in build/outputs/mapping/release/configanalyzer.html erstellt, wenn Sie einen R8-Build ausführen. Wenn Sie die automatische Generierung der Ausgaben deaktivieren möchten, legen Sie die folgende Gradle-Property fest:

android.experimental.r8.enableR8ConfigurationAnalyzer=false

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

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

Mit dem folgenden Befehl wird beispielsweise der HTML-Bericht im Verzeichnis /tmp/r8analysis erstellt:

// 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 App-Leistung Ihrer App verbessern. Anhand der folgenden Werte können Sie nachvollziehen, wie viel von Ihrer Codebasis für die Optimierung durch R8 verfügbar ist.

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

Wert für die Reduzierung

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

Optimierungsfaktor

R8 führt Optimierungen wie das Inlining von Methoden und das Zusammenführen von Klassen durch, wodurch sich die Startzeit und der Speicherverbrauch 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.

Wert für die Verschleierung

Durch die Verschleierung von Klassen, Feldern und Methoden in kürzere Namen reduziert R8 den Metadaten-Footprint der App, um Speicher zu sparen. Der Wert für die Verschleierung 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.

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 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.
  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 die Reflektion 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 Drittanbieterbibliotheken einbinden, enthalten diese oft eigene Keep-Regeln für Verbraucher, die mit R8 verwendet werden können. 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 der einzelnen Keep-Regeln aus einer Drittanbieterbibliothek analysieren, können Sie die spezifischen Drittanbieterbibliotheken identifizieren und nachverfolgen, die eine hohe Optimierung in Ihrer App verhindern.

Bibliotheken optimieren

  • 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 zwei Keep-Regeln in Ihrer Codebasis 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 innerhalb des Pakets abzielt, die von der ersten Keep-Regel beibehalten wird. Wenn sich Keep-Regeln überschneiden, kann eine mehr Optimierungen blockieren als nötig. Durch die Verfeinerung dieser sich überschneidenden Regeln 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 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 die Reflektion 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. Anhand des Prozentsatzes der Optimierung, die durch die einzelnen Keep-Regeln verhindert wird, können Sie erkennen, 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 reflektiv zugegriffen wird, entfernen Sie die allgemeinere Keep-Regel. So können Sie R8-Optimierungen für den Rest Ihres Pakets sicher aktivieren.
    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. Achten Sie darauf, dass Sie die allgemeine Regel so verfeinern, 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 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 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 identifizieren, können Sie Ihre Konfiguration bereinigen.