R8 Configuration Analyzer verwenden

Das R8-Konfigurationsanalysetool wurde entwickelt, um Ihnen zu helfen, die Leistungsvorteile von R8 zu maximieren. 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 geben den Prozentsatz Ihrer Codebasis an, der für die Optimierung verfügbar ist. Durch die Identifizierung allgemeiner oder unnötiger Regeln zum Beibehalten von Ressourcen, einschließlich der Regeln, die von Drittanbieterbibliotheken eingeführt wurden, hilft Ihnen das Analysetool, 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-Konfigurationsanalysetools mit einer dedizierten eigenständigen Gradle-Aufgabe oder automatisch während eines R8-Builds erstellen.

Eigenständige Gradle-Aufgabe ausführen (für die lokale Verwendung empfohlen)

Wenn Sie aktiv an Regeln zum Beibehalten von Ressourcen arbeiten, verwenden Sie die eigenständige Gradle-Aufgabe, um die Auswirkungen Ihrer Änderungen schnell zu bewerten, ohne das APK oder App Bundle vollständig zu erstellen:

./gradlew :app:analyzeReleaseR8Config

Da bei dieser Aufgabe die APK- oder App Bundle-Generierung übersprungen wird, ist die Feedbackschleife viel kürzer. So können Sie schnell analysieren, wie sich Ihre Regeln zum Beibehalten von Ressourcen 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 während regulärer 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 während regulärer Builds deaktivieren möchten, legen Sie die folgende Gradle-Property fest:

android.experimental.r8.enableR8ConfigurationAnalyzer=false

Für AGP 9.2 und früher

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, der mit R8 aktiviert wurde.

./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

Das R8-Konfigurationsanalysetool bietet Einblicke in die R8-Konfiguration Ihrer App und die Auswirkungen der einzelnen Regeln zum Beibehalten von Ressourcen 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 für die Optimierung durch R8 verfügbar ist.

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

Punktzahl verringern

Wenn R8 Ihre App komprimiert, wird die Gesamtgröße Ihrer App reduziert, 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 Entfernung von Ressourcen 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 die Verschleierung 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.

Regeln zum Beibehalten von Ressourcen verfeinern

Um die Werte zu verbessern und eine bessere R8-Optimierung zu ermöglichen, sollten Sie Ihre Regeln zum Beibehalten von Ressourcen verfeinern, damit R8 Ihre App nicht unnötig optimieren kann. Sie sollten nur Klassen, Methoden oder Felder beibehalten, auf die über die Reflektion zugegriffen wird.

Verwenden Sie dazu die Analyse der Regeln zum Beibehalten von Ressourcen.

Beispiel für die Analyse von Aufbewahrungsregeln
Abbildung 2. Beispiel für die Analyse der Regeln zum Beibehalten von Ressourcen

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 Analyse der Regeln zum Beibehalten von Ressourcen

Regeln zum Beibehalten von Ressourcen verfeinern

So verfeinern Sie Ihre Regeln zum Beibehalten von Ressourcen und nutzen das volle Potenzial der R8-Optimierungen für Ihre App:

  1. In Configuration Analyzer sehen Sie für jede Regel zum Beibehalten von Ressourcen den Prozentsatz der Klassen, Felder und Methoden, die von R8 nicht optimiert werden können. So können Sie die Regeln zum Beibehalten von Ressourcen identifizieren, die die Optimierung in einer großen Anzahl von Klassen, Feldern oder Methoden verhindern. Die Optimierungseigenschaften, die durch jede Regel zum Beibehalten von Ressourcen verhindert werden, sind ebenfalls aufgeführt.
  2. Wenn Sie eine Regel zum Beibehalten von Ressourcen sehen, die die Optimierung einer großen Anzahl von Klassen verhindert, sollten Sie prüfen, welche Klassen, Felder und Methoden durch die 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 Regeln zum Beibehalten von Ressourcen blockierte Optimierung, indem Sie nur die erforderlichen Klassen, Felder oder Methoden auswählen. Wählen Sie dazu die richtige Option zum Beibehalten von Ressourcen aus und folgen Sie den Best Practices.
  4. Untersuchen Sie die betroffenen Klassen, Felder und Methoden der Regel zum Beibehalten von Ressourcen und führen Sie Tests durch, um die Regeln zum Beibehalten von Ressourcen zu verfeinern.

Optimierung von Bibliotheken prüfen

Wenn Sie Drittanbieterbibliotheken einbinden, enthalten diese oft eigene Regeln zum Beibehalten von Ressourcen, 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-Konfigurationsanalysetool können Sie Bibliotheken identifizieren, die Regeln einführen, die sich negativ auf die Optimierung Ihrer App auswirken.

Verwenden Sie das Konfigurationsanalysetool, um die kombinierte Wirkung aller zusammengeführten Regeln zum Beibehalten von Ressourcen zu prüfen. Wenn Sie die Auswirkungen jeder Regel zum Beibehalten von Ressourcen aus einer Drittanbieterbibliothek analysieren, können Sie die spezifischen Drittanbieterbibliotheken identifizieren und nachverfolgen, die eine hohe Optimierung in Ihrer App verhindern.

Bibliotheken optimieren

So gehen Sie mit Regeln zum Beibehalten von Ressourcen 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.

Untergeordnete Regeln

Es kann vorkommen, dass sich mehrere Regeln zum Beibehalten von Ressourcen überschneiden und eine der Regeln mehr Optimierung verhindert als nötig. Wenn sich in Ihrer Codebasis zwei Regeln zum Beibehalten von Ressourcen 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 Regel zum Beibehalten von Ressourcen, die die Optimierung im gesamten Paket verhindert, ist untergeordnet der zweiten Regel zum Beibehalten von Ressourcen, die auf eine Klasse innerhalb des Pakets abzielt, das von der ersten Regel zum Beibehalten von Ressourcen beibehalten wird. Wenn sich Regeln zum Beibehalten von Ressourcen ü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 beseitigen. Dazu müssen Sie Ihre Konfiguration optimieren, damit nur der wesentliche Code beibehalten wird, und gleichzeitig das volle Potenzial der Optimierungsfunktionen von R8 nutzen.

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

Untergeordnete Regeln optimieren

  1. Suchen Sie mit dem R8-Konfigurationsanalysetool nach den übergeordneten Regeln zum Beibehalten von Ressourcen.
  2. Identifizieren Sie die genauen Klassen, Felder oder Methoden in Ihrer Codebasis, die tatsächlich auf die Reflektion angewiesen sind und mit Regeln zum Beibehalten von Ressourcen beibehalten werden müssen. So können Sie die Regeln zum Beibehalten von Ressourcen verfeinern.
  3. Vergleichen Sie mit dem Konfigurationsanalysetool die Auswirkungen der einzelnen Regeln, die auf dieselben Klassen, Felder oder Methoden abzielen. Sie können den Prozentsatz der Optimierung verwenden, die durch jede Regel zum Beibehalten von Ressourcen 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 reflektiv zugegriffen wird, entfernen Sie die allgemeinere Regel zum Beibehalten von Ressourcen. So können Sie R8-Optimierungen für den Rest Ihres Pakets sicher freigeben.
    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 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 Regeln zum Beibehalten von Ressourcen zu identifizieren 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 null 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, und erhöhen die Komplexität der Konfiguration unnötig.
  • Identische Regeln: Identische Regeln zum Beibehalten von Ressourcen sind Regeln, die auf dieselben Klassen, Felder und Methoden abzielen, oder doppelte Deklarationen von Regeln zum Beibehalten von Ressourcen in derselben oder in verschiedenen Dateien mit Regeln zum Beibehalten von Ressourcen.

Beide Arten von Regeln überladen Ihre Konfiguration und erschweren die Wartung und Fehlerbehebung. Wenn Sie diese identifizieren, können Sie Ihre Konfiguration bereinigen.