R8 bietet globale Optionen, die entweder die Optimierungen von R8 in der gesamten App ändern oder sich auf jede Keep-Regel auswirken. Diese Optionen werden zusammen mit Aufbewahrungsregeln in der Datei proguard-rules.pro verwaltet. Mit einigen dieser globalen Optionen wird die Optimierung zusätzlich konfiguriert, mit anderen werden bestimmte Aspekte der Optimierung deaktiviert.
R8 akzeptiert auch einige Legacy-Optionen, die von ProGuard übernommen wurden, ignoriert sie aber. Weitere Informationen finden Sie unter Alte ProGuard-Optionen entfernen.
Globale Optionen für zusätzliche Optimierung
Mit den folgenden globalen Optionen lässt sich die Optimierung weiter verbessern:
-repackageclasses [<optional-package-name>]: Klassen werden in einem einzigen Paket neu verpackt, um die App-Größe zu reduzieren. Wenn Sie den optionalen Paketnamen nicht angeben, werden die Klassen in das unbenannte (Standard-)Paket verschoben. Dies ist die empfohlene Einstellung für Apps, da sie zu kleineren DEX-Dateien führt, indem das Paketpräfix aus Klassennamen weggelassen wird. Seit Android Gradle Plug-in (AGP) 9.1 ist dies die Standardkonfiguration für Apps. Wenn Sie diese Optimierung deaktivieren möchten, verwenden Sie-dontrepackage.-allowaccessmodification: Ermöglicht R8, die Sichtbarkeit von Klassen, Feldern und Methoden zu ändern (in der Regel zu erweitern), um umfangreichere Optimierungen durchzuführen. Aktiviert, wennproguard-android-optimize.txtverwendet wird. Seit Android Gradle-Plug-in (AGP) 8.2 ist dies die Standardkonfiguration, wenn Sie die vollständige Optimierung mit R8 aktivieren.-processkotlinnullchecks [level]: Ermöglicht R8, die Nullprüfungen von Kotlin Intrinsics so zu ändern, dass entweder nur die Fehlermeldung entfernt oder die explizite Nullprüfung vollständig entfernt wird.Die
level-Werte, sortiert vom schwächsten zum stärksten, haben die folgende Wirkung:keepändert die Prüfungen nicht.remove_messageschreibt jeden Methodenaufruf der Prüfung in einen Aufruf vongetClass()für das erste Argument des Aufrufs um. Dadurch wird die Nullprüfung beibehalten, aber ohne Meldung.- Mit
removewerden die Prüfungen vollständig entfernt.
Standardmäßig verwendet R8
remove_message. Jede Spezifikation von-processkotlinnullchecksüberschreibt das. Wenn der Parameter mehrmals angegeben wird, wird der stärkste Wert verwendet.-processkotlinnullcheckswird ab AGP 9.0.0 unterstützt.
Hier sehen Sie ein Beispiel für eine Konfiguration mit aktivierter zusätzlicher Optimierung:
-repackageclasses
-allowaccessmodification
Globale Optionen zum Einschränken der Optimierung
Mit den folgenden globalen Optionen können Sie bestimmte Aspekte der App-Optimierung deaktivieren. Das ist hilfreich, wenn Sie Ihre Keep-Regeln optimieren oder R8 zum ersten Mal aktivieren.
-dontoptimize: Verhindert die Codeoptimierung, z. B. das Inlining von Methoden. Diese Option kann während der Entwicklung verwendet werden, sollte aber nicht in Produktions-Builds verwendet werden.-dontshrink: Verhindert das Entfernen von nicht referenzierten Code und Codeoptimierungen. Diese Option kann während der Entwicklung verwendet werden, sollte aber nicht in Produktions-Builds enthalten sein.-dontobfuscate: Verhindert das Kürzen der Namen von Klassen und Methoden. Es kann besonders hilfreich sein, die Verschleierung während des Debuggens zu deaktivieren, damit Stacktraces leichter zu lesen sind. Diese Option kann während der Entwicklung verwendet werden, sollte aber nicht in Produktions-Builds enthalten sein.-keepattributes <attributes>: Akzeptiert eine durch Kommas getrennte Liste von Attributen, die beibehalten werden sollen. Wenn Sie nicht die Standard-proguard-android-optimize.txtverwenden, entfernt R8 alle Attribute, einschließlichRuntimeVisibleAnnotationsundSignature. Es kann jedoch hilfreich sein, diese Attribute beizubehalten, wenn sie in Fällen wie der Reflexion benötigt werden. Eine Liste der Attribute, die Sie angeben können, finden Sie unter Attribute beibehalten.
Attribute beibehalten
Attribute sind zusätzliche Informationen, die an verschiedene Teile Ihres Codes angehängt werden. In Attributen werden Informationen wie Annotationen und generische Signaturen aus Ihrem Code gespeichert.
Für bestimmte reflektierende Vorgänge müssen bestimmte Attribute beibehalten werden, damit sie erfolgreich ausgeführt werden können. Beispiel:
- Wenn Sie mit
getEnclosingMethod()odergetDeclaredClasses()auf die innere oder äußere Klassenstruktur zugreifen, sind die AttributeEnclosingMethodundInnerClasseserforderlich. - Wenn Sie mit
getTypeParameters()auf generische Signaturen zugreifen, ist das AttributSignatureerforderlich. Wenn Sie mit
getAnnotation()auf Annotationen zugreifen, ist das AttributRuntimeVisibleAnnotationserforderlich.
Häufig erforderliche Attribute
Wenn Sie die Standard-Proguard-Datei (proguard-android-optimize.txt oder proguard-android.txt) verwenden, behält das Android-Gradle-Plug-in (AGP) die folgenden Attribute bei. Für einige dieser Attribute sind neuere Versionen von AGP erforderlich:
| Attribut | Beschreibung |
|---|---|
AnnotationDefault |
Dieses Attribut ist in den Annotationstypen selbst enthalten und speichert den Standardwert für ein Annotationselement. Hinweis:Dieses Attribut wird seit AGP 7.1 standardmäßig beibehalten und muss nur in Apps mit früheren AGP-Versionen explizit beibehalten werden. |
EnclosingMethod |
Dieses Attribut ist in inneren Klassen vorhanden, die keine lokalen oder anonymen Klassen sind. Sie gibt die Methode oder Initialisierung an, die die Klasse unmittelbar enthält. |
InnerClasses |
In diesem Attribut werden Informationen zu verschachtelten Klassen (innere Klassen, statische verschachtelte Klassen, lokale Klassen und anonyme Klassen) erfasst, die in einer anderen Klasse definiert sind. |
LineNumberTable |
Mit diesem Attribut werden Bytecode-Anweisungen den entsprechenden Zeilennummern in der ursprünglichen Quelldatei zugeordnet. Hinweis:Dieses Attribut wird seit Android Gradle-Plug-in (AGP) 8.6 standardmäßig beibehalten und muss nur in Apps mit früheren Versionen von AGP explizit beibehalten werden. |
RuntimeVisibleAnnotations |
In diesem Attribut werden Anmerkungen gespeichert, die zur Laufzeit durch Reflektion sichtbar sind. Wenn Anmerkungen zur Laufzeit verwendet werden, ist dies in der Regel die einzige Anmerkung aus den *Annotation-Attributen, die von Apps und in Regeln für Bibliotheksnutzer benötigt wird. |
RuntimeVisibleParameterAnnotations |
In diesem Attribut werden Anmerkungen gespeichert, die zur Laufzeit durch Reflektion der Parameter einer Methode sichtbar sind. |
RuntimeVisibleTypeAnnotations |
In diesem Attribut werden Anmerkungen gespeichert, die sich auf die Verwendung von Typen und nicht nur auf Deklarationen beziehen. Dieses Attribut ist zur Laufzeit sichtbar. |
Signature |
In diesem Attribut wird eine allgemeinere Typsignatur für Klassen, Methoden und Felder gespeichert, insbesondere wenn sie Generics wie List<String> verwenden. |
SourceFile |
In diesem Attribut wird der Name der Quelldatei (.kt- oder .java-Datei) gespeichert, aus der eine Klasse kompiliert wurde. Sie wird hauptsächlich von Debuggern verwendet, um die ursprünglichen Quellcodezeilen anzuzeigen, wenn der kompilierte Java-Code durchlaufen wird. So können Entwickler die Ausführung auf ihren geschriebenen Code zurückführen. Hinweis:Dieses Attribut wird seit AGP 8.2 standardmäßig beibehalten und muss nur in Apps mit früheren AGP-Versionen explizit beibehalten werden. |
Für Apps, die proguard-android-optimize.txt verwenden, sind die von AGP definierten Keep-Regeln in den meisten Fällen ausreichend. Wenn Sie jedoch Code für eine Bibliothek schreiben, sollten Sie alle Attribute, die für Ihre Bibliothek erforderlich sind, in den Keep-Regeln für Nutzer angeben, auch wenn sie in dieser Liste definiert sind. So wird sichergestellt, dass Ihre Bibliothek auch dann funktioniert, wenn Entwickler proguard-android-optimize.txt nicht einbinden.
Zusätzliche Attribute für die Beibehaltung
Sie können zusätzliche Attribute angeben, die beibehalten werden sollen. Diese sind jedoch für die meisten Szenarien mit Reflexion oder JNI-Zugriff nicht erforderlich. Einige davon werden jedoch möglicherweise weiterhin häufig verwendet, wenn Bibliotheken optimiert werden.
| Attribut | Beschreibung |
|---|---|
MethodParameters |
Dieses Attribut enthält Informationen zu den Parametern einer Methode, insbesondere zu ihren Namen und Zugriffsflags. |
Exceptions |
Dieses Attribut listet die geprüften Ausnahmen auf, die von einer Methode ausgelöst werden können. Dieses Attribut wird normalerweise nicht für Apps verwendet. Für Bibliotheksautoren wird es in der Regel nicht in Keep-Regeln für Verbraucher verwendet, sondern häufig beim Erstellen von Bibliotheken. Weitere Informationen zum Optimieren von Bibliotheken finden Sie unter Optimierung für Bibliotheksautoren. |
RuntimeInvisibleAnnotations |
In diesem Attribut werden Annotationen gespeichert, die zur Laufzeit nicht durch Reflektion sichtbar sind. App-Entwickler sollten dieses Attribut nicht beibehalten. Für Bibliotheksautoren ist dieses Attribut in Keep-Regeln für Nutzer nicht relevant, wird aber häufig beim Erstellen von Bibliotheken verwendet. Weitere Informationen zum Optimieren von Bibliotheken finden Sie unter Optimierung für Bibliotheksautoren. |
RuntimeInvisibleParameterAnnotations |
In diesem Attribut werden Anmerkungen gespeichert, die zur Laufzeit nicht durch Reflektion für die Parameter einer Methode sichtbar sind. App-Entwickler sollten dieses Attribut nicht beibehalten. Für Bibliotheksautoren ist dieses Attribut in Keep-Regeln für Nutzer nicht relevant, wird aber häufig beim Erstellen von Bibliotheken verwendet. Weitere Informationen zum Optimieren von Bibliotheken finden Sie unter Optimierung für Bibliotheksautoren. |
RuntimeInvisibleTypeAnnotations |
In diesem Attribut werden Anmerkungen gespeichert, die sich auf die Verwendung von Typen und nicht nur auf Deklarationen beziehen. Dieses Attribut ist zur Laufzeit nicht sichtbar. App-Entwickler sollten dieses Attribut nicht beibehalten. Für Bibliotheksautoren ist dieses Attribut in Keep-Regeln für Nutzer nicht relevant, wird aber häufig beim Erstellen von Bibliotheken verwendet. Weitere Informationen zum Optimieren von Bibliotheken finden Sie unter Optimierung für Bibliotheksautoren. |
Alte ProGuard-Optionen entfernen
R8 akzeptiert einige Optionen, die nur in ProGuard eine Wirkung hatten, ignoriert sie aber.
Diese Optionen sind oft in Konfigurationen enthalten, die von ProGuard migriert oder aus älteren Projekten kopiert wurden. Da sie keine Auswirkungen auf die R8-Ausgabe haben, sollten Sie sie aus der Datei proguard-rules.pro entfernen, damit Ihre Konfiguration leichter zu verstehen und zu verwalten ist.
R8 ignoriert die folgenden Optionen, ohne eine Warnung auszugeben:
-adaptkotlinmetadata-android-dontpreverify-dontskipnonpubliclibraryclasses-dontskipnonpubliclibraryclassmembers-dontusemixedcaseclassnames-forceprocessing-mergeinterfacesaggressively-optimizationpasses-optimizations-overloadaggressively-target-verbose
R8 ignoriert die folgenden Optionen und gibt während des Builds eine Warnung aus:
-addconfigurationdebugging(Unterstützung wurde in AGP 9.0 entfernt)-assumenoescapingparameters-assumenoexternalreturnvalues-assumenoexternalsideeffects-dump-useuniqueclassmembernames
R8 unterstützt -skipnonpubliclibraryclasses nicht und meldet einen Fehler, wenn Ihre Konfiguration diese enthält.