Da die Optimierungen von R8 den Code Ihrer App aktualisieren, ist es wichtig, das Verhalten Ihrer App gründlich zu testen, um sicherzustellen, dass sie wie erwartet funktioniert. Bei unerwartetem Verhalten finden Sie auf dieser Seite eine Anleitung zur Fehlerbehebung bei potenziellen Problemen nach der Optimierung. Weitere Informationen zu Regeln, mit denen Sie die Optimierung beheben können, finden Sie unter Regeln zur Fehlerbehebung bei der Optimierung verwenden.
Konzentrieren Sie sich bei der Fehlerbehebung auf die folgenden Situationen:
- Überoptimierung führt zu App-Abstürzen: Ihre App stürzt ab, weil R8 zu viel Code optimiert hat.
- Unklare oder unzureichende Optimierung: R8 hat Ihre App nicht so stark optimiert, wie Sie erwartet haben, oder Sie benötigen weitere Erklärungen zu den Optimierungen.
App stürzt immer wieder ab
Wenn Ihre App nach der Optimierung mit R8 abgestürzt ist, liegt das in der Regel an einer fehlerhaften Reflektion. So erkennen Sie eine fehlerhafte Reflektion:
- Sie sehen eine Ausnahme, die bedeutet, dass die angegebene Klasse, Methode oder das angegebene Feld durch Reflektion verwendet wird. Diese Ausnahmen sind in der Regel eine der folgenden:
ClassNotFoundException,NoSuchMethodException,NoSuchFieldException,NoClassDefFoundError,NoSuchMethodError,NoSuchFieldError. - Sie sehen Code, der mit
import kotlin.reflect.*oderimport java.lang.reflect.*auf Reflektion verweist. - Sie sehen, dass ein Klassenkonstruktor so verwendet wird:
Something::class.constructors. - Sie sehen
Class.forName(...).
Lösung: Fügen Sie eine Keep-Regel hinzu.
Wenn die Reflektion in Ihrem eigenen Code erfolgt, können Sie diesen Code mit Jetpack Keep Annotationen versesehen, anstatt eine Keep-Regel hinzuzufügen. Die Jetpack Keep-Lint-Prüfungen kennzeichnen auch andere Reflektionsaufrufe, die nicht mit Annotationen versehen sind. So können Sie ähnliche Abstürze vermeiden.
Unklare oder unzureichende Optimierung
Da Regeln sowohl aus Ihrer App als auch aus den enthaltenen Bibliotheken angewendet werden, benötigen Sie möglicherweise weitere Informationen zu den angewendeten Regeln oder eine Erklärung dafür, warum R8 bestimmte Codeabschnitte beibehalten hat, die Sie optimieren wollten.
Unklarheit über die angewendeten Regeln: Da Regeln aus enthaltenen Bibliotheken auch auf Ihre App angewendet werden und globale Optionen aus diesen Bibliotheken auch an Ihre App weitergegeben werden, sind Sie möglicherweise unsicher, welche Regeln angewendet werden.
Lösung: Sehen Sie sich den Bericht aller Regeln an, die R8 beim Erstellen Ihres Projekts anwendet. Sie finden diesen Bericht unter
./app/build/outputs/mapping/configuration.txt. Dieser Bericht enthält alle zusammengeführten Regeln aus allen Bibliotheken und Modulen, die zum Konfigurieren von R8 verwendet wurden. Sie können damit ineffiziente Regeln identifizieren.Zu viel Code wird beibehalten: Bei der Optimierung durch R8 wird möglicherweise Code beibehalten, den Sie entfernen wollten.
Lösung: Verwenden Sie die Konfigurationsoption
-whyareyoukeeping, um zu verstehen, warum der Code beibehalten wurde. Die Ausgabe enthält einen Pfad vom beibehaltenen Code zu einem der Einstiegspunkte Ihrer App. Weitere Informationen finden Sie unter-whyareyoukeeping.Schwierigkeiten beim Verständnis des ursprünglichen Stack-Traces: R8 ändert den Code auf verschiedene Weise, sodass sich der Stack-Trace nicht mehr auf den ursprünglichen Code bezieht. So können sich beispielsweise Zeilennummern und die Namen von Klassen und Methoden ändern.
Lösung: Ab Android Studio Otter 3 Feature Drop und AGP 9.0 werden Stack-Traces in Logcat automatisch deobfuskiert. Wenn Sie jedoch eine frühere Version von Android Studio verwenden, müssen Sie den ursprünglichen Stack-Trace manuell wiederherstellen. Verwenden Sie dazu das
retraceBefehlszeilentool, das im Befehlszeilentools Paket enthalten ist.Geben Sie für die Verwendung von
retraceden Befehl mit dem Pfad zu einer Zuordnungsdatei und einer Stack-Trace-Datei an. Die Zuordnungsdateimapping.txtwird automatisch mit Ihrem Android App Bundle (AAB) gebündelt. Weitere Informationen finden Sie in der Dokumentation zu „retrace“ und im Play Console-Hilfeartikel zu den Absturz-Stacktraces offenlegen. Wenn Sie Play und Firebase Crashlytics verwenden, verwenden Sie die Dateimapping.txtmit den Abstürzen, die der Dienst von App-Nutzern erfasst. Der folgende Befehl zeigt, wie Sieretraceaus dem Stammverzeichnis Ihres Projekts ausführen können:$ANDROID_HOME/cmdline-tools/latest/bin/retrace app/build/outputs/mapping/$releaseVariant/mapping.txt trace.txt
Fehler melden
Wenn Sie ein Problem mit R8 nicht beheben können, melden Sie einen Fehler.