Da durch die Optimierungen von R8 der Code Ihrer App aktualisiert wird, ist es wichtig, das Verhalten Ihrer App gründlich zu testen, um sicherzustellen, dass sie wie erwartet funktioniert. Bei unerwartetem Verhalten können Sie diese Seite als Leitfaden zur Behebung potenzieller Probleme nach 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 fehlerhafte Spiegelungen:
- Sie beobachten eine Ausnahme, was in der Regel bedeutet, dass die angegebene Klasse, Methode oder das angegebene Feld durch Reflexion 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 die Reflektion verweist. - Sie sehen, dass ein Klassenkonstruktor so verwendet wird:
Something::class.constructors. - Folgende Informationen werden angezeigt:
Class.forName(...).
Lösung: Fügen Sie eine Aufbewahrungsregel hinzu.
Unklare oder unzureichende Optimierung
Da Regeln sowohl auf Ihre App als auch auf enthaltene Bibliotheken angewendet werden, benötigen Sie möglicherweise zusätzliche Informationen zu den angewendeten Regeln oder eine Erklärung dafür, warum R8 bestimmte Codeabschnitte beibehalten hat, die Ihrer Meinung nach optimiert werden sollten.
Unklarheit über die angewendeten Regeln: Da Regeln aus enthaltenen Bibliotheken auch für Ihre App gelten und globale Optionen aus diesen Bibliotheken auch auf Ihre App übertragen werden, sind Sie möglicherweise unsicher, welche Regeln angewendet werden.
Lösung: Sehen Sie sich den Bericht mit allen Regeln an, die von R8 beim Erstellen Ihres Projekts angewendet werden, um herauszufinden, welche Regeln angewendet werden. Diesen Bericht finden Sie unter
./app/build/outputs/mapping/configuration.txt. Dieser Bericht enthält alle zusammengeführten Regeln aus jeder Bibliothek und jedem Modul, die zum Konfigurieren von R8 verwendet wurden. Er kann verwendet werden, um ineffiziente Regeln zu identifizieren.Zu viel Code wird beibehalten: Bei der Optimierung durch R8 wird möglicherweise Code beibehalten, den Sie eigentlich entfernen wollten.
Lösung: Verwenden Sie die Konfigurationsoption
-whyareyoukeeping, um nachzuvollziehen, 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 Nachvollziehen des ursprünglichen Stacktrace: R8 ändert Code auf verschiedene Weise, sodass sich der Stacktrace nicht mehr auf den ursprünglichen Code bezieht. Beispielsweise können sich Zeilennummern und die Namen von Klassen und Methoden ändern.
Lösung: Ab Android Studio Otter 3 Feature Drop und AGP 9.0 werden Stacktraces in Logcat automatisch deobfuskiert. Wenn Sie jedoch eine frühere Version von Android Studio verwenden, müssen Sie den ursprünglichen Stacktrace manuell wiederherstellen. Verwenden Sie zum Wiederherstellen des ursprünglichen Stacktrace das
retrace-Befehlszeilentool, das im Paket -Befehlszeilentools enthalten ist.Wenn Sie
retraceverwenden möchten, geben Sie den Befehl mit dem Pfad zu einer Zuordnungsdatei und einer Stacktrace-Datei an. Die Zuordnungsdatei mit dem Namenmapping.txtwird automatisch in Ihr Android App Bundle (AAB) aufgenommen. Weitere Informationen finden Sie in der retrace-Dokumentation und im Play Console-Hilfeartikel zum Entschlüsseln von Crash-Stacktraces. Wenn Sie Play und Firebase Crashlytics verwenden, nutzen Sie die Dateimapping.txtmit den Abstürzen, die der Dienst von App-Nutzern erfasst. Der folgende Befehl zeigt, wie Sieretraceüber das 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.