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 den Aufbewahrungsregeln in der Datei proguard-rules.pro
verwaltet. Einige dieser globalen Optionen konfigurieren zusätzliche Optimierungen, während andere bestimmte Aspekte der Optimierung deaktivieren.
Globale Optionen für zusätzliche Optimierung
Mit den folgenden globalen Optionen kann die Optimierung weiter verbessert werden:
-repackageclasses [<optional-package-name>]
: Klassen werden in einem einzigen angegebenen Paket neu verpackt, um die App-Größe weiter zu verringern. Wenn Sie den optionalen Paketnamen nicht angeben, werden die Klassen in das leere Standardpaket verschoben. Dies ist eine empfohlene Einstellung für Apps.-allowaccessmodification
: Ermöglicht R8, die Sichtbarkeit von Klassen, Feldern und Methoden zu ändern (in der Regel zu erweitern), um umfassendere Optimierungen durchzuführen. Aktiviert, wennproguard-android-optimize.txt
verwendet wird. Seit Android Gradle-Plugin (AGP) 8.2 ist dies die Standardkonfiguration, wenn Sie R8 im vollständigen Modus verwenden.
Hier sehen Sie ein Beispiel für eine Konfiguration, bei der die zusätzliche Optimierung aktiviert ist:
-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 verwendet werden.-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 verwendet werden.-keepattributes <attributes>
: Akzeptiert eine durch Kommas getrennte Liste von Attributen, die beibehalten werden sollen. Wenn Sie nicht die Standard-proguard-android-optimize.txt
verwenden, entfernt R8 alle Attribute, einschließlichRuntimeVisibleAnnotations
undSignature
. 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 AttributeEnclosingMethod
undInnerClasses
erforderlich. - Wenn Sie mit
getTypeParameters()
auf generische Signaturen zugreifen, ist das AttributSignature
erforderlich. Wenn Sie mit
getAnnotation()
auf Annotationen zugreifen, ist das AttributRuntimeVisibleAnnotations
erforderlich.
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 den Initialisierer 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 AGP-Versionen explizit beibehalten werden. |
RuntimeVisibleAnnotations |
In diesem Attribut werden Annotationen 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 Annotationen 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 kompilierter 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 Versionen von AGP 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 Consumer angeben, auch wenn sie in dieser Liste definiert sind. So ist Ihre Bibliothek auch dann robust, wenn Entwickler sich entscheiden, proguard-android-optimize.txt
nicht einzubinden.
Zusätzliche Attribute für die Kundenbindung
Sie können zusätzliche Attribute angeben, die beibehalten werden sollen. Diese sind jedoch für die meisten Szenarien mit Reflektion 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 Endnutzer 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 Verbraucher 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 Verbraucher 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 Verbraucher nicht relevant, wird aber häufig beim Erstellen von Bibliotheken verwendet. Weitere Informationen zum Optimieren von Bibliotheken finden Sie unter Optimierung für Bibliotheksautoren. |