Globale Optionen hinzufügen

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, wenn proguard-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ßlich RuntimeVisibleAnnotations und Signature. 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() oder getDeclaredClasses() auf die innere oder äußere Klassenstruktur zugreifen, sind die Attribute EnclosingMethod und InnerClasses erforderlich.
  • Wenn Sie mit getTypeParameters() auf generische Signaturen zugreifen, ist das Attribut Signature erforderlich.
  • Wenn Sie mit getAnnotation() auf Annotationen zugreifen, ist das Attribut RuntimeVisibleAnnotations 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.