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 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, wenn proguard-android-optimize.txt verwendet 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_message schreibt jeden Methodenaufruf der Prüfung in einen Aufruf von getClass() für das erste Argument des Aufrufs um. Dadurch wird die Nullprüfung beibehalten, aber ohne Meldung.
    • Mit remove werden 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.

    -processkotlinnullchecks wird 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.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 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.