
Hallo, ich bin ein Android-Entwickler und habe keine Angst mehr vor ProGuard ...
Normalerweise wird an dieses Dienstprogramm erinnert, wenn ein Dalvik-Dex-Limit-Problem auftritt oder die Anwendungssicherheit verbessert werden muss. Leider ist es noch lange nicht das erste Mal, Proguard richtig zu konfigurieren. Ich habe oft beobachtet, wie viele nach dem Brechen eines Projekts Proguard deaktiviert und den Mulditex-Support aktiviert haben, und jedes Mal war ich ein wenig traurig darüber, weil Proguard sowohl die Größe der Anwendung reduziert als auch deren Leistung erhöht.
Am Ende habe ich beschlossen, einen Artikel zu schreiben, in dem ich alle nützlichen Informationen zusammenfassen kann, die ich über mehrere Jahre in der Arbeit mit Proguard gelernt habe und die sowohl Anfängern als auch denen helfen können, die bereits etwas wissen.
Worum geht es?
Proguard ist ein Open-Source-Dienstprogramm zur Optimierung und Verschleierung von Java-Code. Dieses Tool verarbeitet bereits kompilierten Java-Code und sollte daher mit jeder JVM-Sprache funktionieren. Genauer gesagt ist die Sprache selbst für Proguard gleichgültig, nur der Bytecode ist wichtig. Alle Proguard-Bytecode-Manipulationen können in drei Hauptkategorien unterteilt werden: Code-Verkleinerung , Optimierung und Verschleierung .
Code schrumpft
Ja, es ist ein ziemlich seltsames Unterfangen, Code zu schreiben und dann zu löschen, aber dies ist die Realität der Android-Entwicklung. Hier geht es natürlich nicht um den von Hand geschriebenen Code (obwohl dies passiert), sondern um Tonnen toter Fracht, die von Bibliotheken aller Art gebracht werden. Guava , Apache Commons , Google Play Services und andere Leute können die Größe der Apk-Datei von 500 KB auf einige zehn Megabyte erhöhen. Manchmal geht es so weit, dass ein Programm nicht kompiliert werden kann, weil das Dalvik-Methodenlimit überschritten wird . Proguard hilft dabei, nicht verwendeten Code zu entfernen und die Größe der Anwendung auf einige Megabyte zu reduzieren.
Optimierung
Proguard kann nicht nur unnötigen Code entfernen, sondern auch den verbleibenden Code optimieren. Das Arsenal umfasst Kontrollflussanalyse, Datenflussanalyse, Teilbewertung, statische Einzelzuweisung, Nummerierung globaler Werte und Lebendigkeitsanalyse. Proguard kann Gucklochoptimierungen durchführen, die Anzahl der Zuweisungen von Variablen reduzieren, Schwanzrekursionen vereinfachen und vieles mehr ( Wiki ). Zusätzlich zu solchen allgemeinen Vorgängen verfügt Proguard über Optimierungen, die speziell für die Android-Plattform nützlich sind, z. B. das Ersetzen von Enum-Klassen durch Ints und das Löschen von Protokollierungsanweisungen.
Verschleierung
Schließlich kann Proguard Ihren gesamten Code in ein unlesbares Chaos verwandeln, indem alle Klassen, Methoden und Felder in zufällige (eigentlich nicht ganz zufällige) Buchstaben umbenannt werden. Dies ist eine sehr nützliche Option, da jeder Ihre APK-Datei dekompilieren kann und nicht jeder die Geduld hat, verschleierten Code zu verstehen.
Arbeitsprinzip
Proguard arbeitet in 3 Schritten in der oben beschriebenen Reihenfolge: Code verkleinern → Optimierung → Verschleierung . Jeder der Schritte ist optional.
Der Optimierungsschritt beim Android SDK ist standardmäßig deaktiviert.
Damit Proguard funktioniert, müssen Sie drei Komponenten bereitstellen:
- Ihr kompilierter Code ist ein Archiv mit den
class
Ihres Programms und allen von Ihnen verwendeten Bibliotheken (jar, aar, apk, war, zip usw.). Proguard ändert nur bereits kompilierten Code und hat nichts mit der Quelle zu tun. - Konfigurationsdatei (en) - Datei (en) mit allen Regeln, Optionen und Einstellungen, mit denen Sie die Verarbeitung starten möchten.
- Bibliotheksgläser (aar, apks, ...) - Klassen der Plattform, auf der Ihr Programm ausgeführt wird. Im Fall von Android ist dies
android.jar
. Diese Archive werden nur für die korrekte Analyse Ihres Codes benötigt, sie werden nicht geändert (dies macht keinen Sinn, da android.jar
"am Telefon" ist, haben wir keinen Zugriff darauf).

(Bild aus der Präsentation von Jeb Ware, Link am Ende des Artikels)
Mit Hilfe von Bibliotheksklassen und Ihren Konfigurationsdateien definiert Proguard alle Einstiegspunkte für Ihr Programm ( Seeds ). Mit anderen Worten, es definiert diejenigen Klassen und Methoden, die von außen aufgerufen werden können und die nicht berührt werden können. Dann wird aus entdeckt Samen beginnen, Proguard rekursiv den gesamten Code durch das Kontrollkästchen Markierung alles „genutzt“ , was erreichen konnte. Alle anderen Codes werden gelöscht. Sie müssen mindestens einen Einstiegspunkt in der Konfiguration angeben. Für ein Standard-Java-Programm ist dies die Hauptfunktion. Android hat keinen einzigen Einstiegspunkt in das Programm, sondern Standardkomponenten (Aktivität, Service usw.), die vom System erstellt und aufgerufen werden. Glücklicherweise müssen wir hier nichts selbst angeben, das Android SDK erstellt die erforderliche Konfiguration für uns.
Begleitdateien
Nachdem alle Einstiegspunkte erkannt wurden, schreibt Proguard sie in die Datei seeds.txt
.
Der gesamte Code, den Proguard für unnötig befunden hat, wird in die Datei usage.txt
. Dies ist ein ziemlich seltsamer Name für eine Datei, die Remote-Code enthält. Es wäre korrekter, sie ungewöhnlichage.txt zu nennen, aber wir haben das, was wir haben. Denken Sie daran.
Im Verschleierungsschritt wird eine mapping.txt
Datei erstellt, die die Paare <ursprünglicher Klassenname | Methode | Feld> -> <verschleierter Klassenname | Methode | Feld> enthält. Diese Datei ist nützlich, wenn Sie ein Programm deobfuscieren müssen, z. B. Stacktrace lesen. Das proguardui
Dateien ist nicht erforderlich. Das Android SDK verfügt proguardui
Hilfsprogramme für proguardui
und proguardui
. Wenn Sie Fabric Crashlytics verwenden, kann das Gradle-Plugin diese Datei unabhängig voneinander finden und in die Konsole laden, sodass Sie sich darüber keine Gedanken machen müssen.
Bei Android befinden sich diese Dateien normalerweise in app/build/output/mapping/<product-flavor-name>/
.
Proguard erstellt auch eine dump.txt
Datei, die alles enthält, was Proguard in das endgültige Archiv gestellt hat. Er hat sich für mich nie als nützlich erwiesen, aber vielleicht ist es für jemanden nützlich.
Wie läuft es auf Android?
Das Android Gradle Plugin kann Proguard selbst ausführen. Sie müssen lediglich diese Option aktivieren und die Konfigurationsdateien angeben.
buildTypes { <...> release { minifyEnabled true proguardFiles 'proguard-rules.pro', getDefaultProguardFile('proguard-android.txt') } }
minifyEnabled true
- Aktiviert Proguard zur Erstellungszeit
proguardFiles
- eine Liste von Konfigurationsdateien. Regeln aus allen Konfigurationsdateien werden der allgemeinen Liste in der Reihenfolge hinzugefügt, in der sie angezeigt werden.
proguard-rules.pro
- das ist unsere Konfigurationsdatei mit spezifischen projektspezifischen Regeln
getDefaultProguardFile('proguard-android.txt')
- eine Funktion, die die Standardkonfigurationsdatei für Android-Anwendungen zurückgibt. Es liegt in AndroidSDK/tools/proguard
Tatsächlich verfügt das Android SDK über zwei proguard-android.txt
: proguard-android.txt
und proguard-android-optimize.txt
. Der erste hat die Option -dontoptimize
, mit der alle Optimierungen -dontoptimize
. Wenn Sie die Optimierung aktivieren möchten, verwenden Sie die zweite Konfiguration.
Zusätzlich zu diesen Standardkonfigurationen generiert das Android SDK (aapt) automatisch eine Reihe von Regeln für Ressourcen: aapt überprüft alle XML-Dateien (einschließlich des Manifests), um alle Aktivitäten, Dienste, Ansichten usw. zu finden. und generieren Sie die notwendigen Regeln für sie. Die generierten Regeln finden Sie in app/build/intermediates/proguard-rules/<flavor>/aapt_rules.txt
. Sie müssen es nicht selbst angeben, das Android Gradle Plugin fügt diese Regeln automatisch hinzu.

(Bild aus der Präsentation von Jeb Ware, Link am Ende des Artikels)
Konfigurationen
Das Einrichten von Proguard ist der grundlegendste Teil der Arbeit damit und gleichzeitig der schwierigste. Eine falsche Konfiguration kann die Kompilierung der Anwendung und der Anwendung selbst zur Laufzeit leicht unterbrechen. Alle verfügbaren Konfigurationsoptionen sind ausführlich dokumentiert. Website.
Unter allen Optionen möchte ich die drei wichtigsten Gruppen herausgreifen:
- Regeln einhalten - Alle möglichen Einstiegspunkte in das Programm. Regeln, die Proguard mitteilen, welche Klassen oder Teile von Klassen unverändert bleiben sollen oder welche der Änderungen für bestimmte Klassen gültig sind.
- Optimierungsoptimierung - Geben Sie an, welche Optimierungen akzeptabel sind und wie viele Optimierungszyklen durchgeführt werden müssen.
- Arbeiten Sie mit Warnungen, Fehlern und Debugging
Regeln einhalten
Dies ist eine Reihe von Optionen, die Ihren Code vor dem rücksichtslosen Proguard schützen sollen. In ihrer allgemeinsten Form sieht diese Regel folgendermaßen aus:
-keep [,modifier,...] class_specification
keep
ist die häufigste dieser Optionen (es gibt andere) und weist Proguard an, die Klasse selbst und alle ihre Klassenmitglieder zu speichern: Felder und Methoden.
class_specification
- eine Vorlage, die auf die Klasse (n) oder ihre Teile (Klassenmitglieder) verweist. Die allgemeine Ansicht der Vorlage ist sehr groß und kann deaktiviert werden. Dokumentation . Sie können ihn kontaktieren, aber im Allgemeinen können Sie sich nur daran erinnern, dass wir die Möglichkeit haben, eine Vorlage für diese Komponenten zu erstellen:
- Wählen Sie alle Klassen mit einem bestimmten Namen und Paket aus
- Wählen Sie alle Klassen aus, die bestimmte Klassen / Schnittstellen erben / implementieren
- Wählen Sie alle Klassen mit bestimmten Modifikatoren und / oder bestimmten Anmerkungen aus
- Wählen Sie alle Methoden mit einem bestimmten Namen, Modifikatoren, Argumenten und Rückgabewert aus
- Wählen Sie alle Felder mit einem bestimmten Namen, Modifikatoren eines bestimmten Typs aus.
Es ist möglich, Platzhalter zu verwenden
Auch dies ist keine strenge Beschreibung der Vorlage, sondern eine Liste der Funktionen, die wir haben. Hier einige Beispiele:
-keep public class com.example.MyActivity
halten die Klasse com.example.MyActivity
-keep public class * extends android.app.Activity
Speichern Sie alle öffentlichen Klassen, die android.app.Activity
erben
-keep public class * extends android.view.View { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); public void set*(...); }
Finden Sie alle öffentlichen Klassen, die android.view.View
erben, und speichern Sie darin 3 Konstruktoren mit bestimmten Parametern + alle öffentlichen Methoden, mit dem Modifikator void
, allen Argumenten und einem Namen, der mit set
beginnt. Alle anderen Teile der Klasse können geändert werden.
-keep class com.habr.** { *; }
Speichern Sie alle Klassen und ihren gesamten Inhalt im Paket com.habr
modifiers
- Ergänzung zur Keep-Regel:
includedescriptorclasses
- Zusätzlich zu der angegebenen Klasse / Methode / dem angegebenen Feld müssen Sie alle Klassen speichern, die in ihren Deskriptoren vorkommen.includecode
- Der Inhalt der Methode, auf die diese spezielle Regel includecode
kann ebenfalls nicht berührt werden.allowshrinking
- Klassen, auf die in dieser Regel verwiesen wird, sind keine allowshrinking
und können gelöscht werden, sondern nur, wenn sie nicht im Programm selbst verwendet werden. Wenn dieser Code jedoch nach dem Schrumpfen des Codes erhalten bleibt (aufgrund der Tatsache, dass jemand ihn verwendet), ist es unmöglich, diesen Code zu optimieren / zu verschleiern.allowoptimization
- Klassen, auf die sich diese Regel bezieht, können nur optimiert, aber nicht entfernt oder verschleiert werden.allowobfuscation
- Klassen, auf die in dieser Regel verwiesen wird, können nur verschleiert, aber nicht entfernt oder optimiert werden.
Neben keep
gibt es ein paar Optionen:
-keepclassmembers
- -keepclassmembers
an, dass Klassenmitglieder gespeichert werden sollen, wenn die Klasse selbst nach dem Verkleinern des Codes erhalten bleibt.
-keepclasseswithmembers
- gibt an, dass Sie Klassen speichern möchten, deren Inhalt unter die angegebene Vorlage fällt. Beispiel: -keepclasseswithmembers class * { public <init>(android.content.Context); }
-keepclasseswithmembers class * { public <init>(android.content.Context); }
- speichert alle Klassen, die einen öffentlichen Konstruktor haben, mit einem Argument vom Typ Context
.
-keepnames
- -keepnames
für -keep,allowshrinking
.
-keepclassmembernames
- Abkürzung für -keepclassmembers,allowshrinking
.
keepclasseswithmembernames
- keepclasseswithmembernames
für -keepclasseswithmembers,allowshrinking
.
Optimierungstuning
Die wichtigste Option ist hier das Flag -dontoptimize
. Wenn es vorhanden ist, wird keine Optimierung durchgeführt und alle anderen Optimierungsoptionen werden ignoriert.
Es gibt viele Optimierungsoptionen, aber die folgenden sind für mich am nützlichsten:
-optimizations optimization_filter
- listet alle Möglichkeiten auf, die Sie verwenden möchten. Es ist besser, die in proguard-android-optimize.txt
angegebene Menge oder eine Teilmenge davon zu verwenden. Eine Liste aller Optimierungen finden Sie hier .
-optimizationpasses n
- Anzahl der Optimierungszyklen. Mehrere Zyklen können das Ergebnis verbessern. Gleichzeitig ist Proguard intelligent genug, um Zyklen zu stoppen, wenn sich herausstellt, dass sich das Ergebnis seit dem letzten Mal nicht verbessert hat.
-assumenosideeffects class_specification
- gibt an, dass diese Methode keine Nebenwirkungen hat und nur einen bestimmten Wert zurückgibt. Proguard löscht Aufrufe dieser Methode, wenn festgestellt wird, dass das zurückgegebene Ergebnis nicht verwendet wird. Möglicherweise wird diese Option am häufigsten verwendet, um alle Debug-Protokolle zu löschen: -assumenosideeffects class android.util.Log { public static int d(...); }
-assumenosideeffects class android.util.Log { public static int d(...); }
-allowaccessmodification
- zeige alles, was versteckt ist :) Eine großartige Option, mit der du eine Reihe künstlicher Zugriffsmethoden für verschachtelte Klassen loswerden kannst. Funktioniert nur in Verbindung mit -repackageclasses
-repackageclasses
- -repackageclasses
Verschieben aller Klassen in ein angegebenes Paket. Dies gilt eher für die Verschleierung, führt aber gleichzeitig zu guten Ergebnissen bei der Optimierung.
Andere nützliche Optionen
-dontwarn
und -dontnote
Proguard ist sehr intelligent und meldet während der Codeanalyse immer verdächtige Stellen. Manchmal sind dies Notizen, manchmal Warnungen. Wenn Ihr Build nicht mit aktiviertem Proguard ausgeführt wird, lesen Sie unbedingt alle von ihm erstellten Protokolle. Es schreibt, was schief gelaufen ist, und zeigt Ihnen höchstwahrscheinlich sogar, wie Sie das Problem beheben können. Nachdem Sie alle Nachrichten gelesen haben, beheben Sie entweder das Problem oder ignorieren die Nachricht einer dieser Optionen, wenn Sie sicher sind, dass kein Problem vorliegt.
Es kommt beispielsweise vor, dass einige Java-Bibliotheken Plattformklassen verwenden, die sich nicht in android.jar befinden, und Proguard warnt davor. Wenn Sie sicher sind, dass diese Bibliothek in einer Android-Umgebung -dontwarn java.lang.management.**
funktioniert, können Sie diese Warnung -dontwarn java.lang.management.**
warnen -dontwarn java.lang.management.**
-whyareyoukeeping class_specification
ist eine nützliche Option, die den Grund druckt, warum Proguard beschlossen hat, diese Klasse / Methode nicht zu berühren.
-verbose
- -verbose
detailliertere Protokolle und Ausnahmen
-printconfiguration
- druckt eine vollständige Liste der Optionen aus allen verwendeten Konfigurationsdateien, einschließlich Regeln aus Bibliotheken, die über aapt generiert wurden.
-keepattributes SourceFile, LineNumberTable
- speichert Metainformationen (Dateinamen, Zeilennummerierung), um Code in der IDE zu debuggen und eine aussagekräftige Stapelverfolgung zu erhalten. Stellen Sie sicher, dass Sie diese Option hinzufügen.
Übe
Dies geschieht normalerweise: Schalten Sie Proguard ein und Sie brechen das gesamte Projekt ab, was zu einer Menge Fehlern führt. Viele schalten in diesem Schritt Proguard aus und versuchen, nicht dorthin zurückzukehren. Ich werde versuchen, einige Tipps zu geben, um diesen Übergangsprozess zu vereinfachen.
Entscheiden Sie sich für die Startpunkte
Wenn Sie ein Android-Entwickler sind, ist alles äußerst elementar - wählen Sie einfach eine der beiden Standardkonfigurationen aus dem Android SDK aus: proguard-android.txt
oder proguard-android-optimize.txt
. Sie kümmern sich um alles, was unberührt bleiben sollte.
Überprüfen Sie alle Bibliotheken
In letzter Zeit werden immer mehr Bibliotheken mit vorgefertigten Proguard-Konfigurationen verteilt. Proguard kann in das Archiv schauen, die Bibliothekskonfiguration finden und sie anderen Optionen hinzufügen. Überprüfen Sie jede Bibliothek, die Sie für eine solche Konfiguration verwenden.

(Inhalt einer AAR-Datei einer der Bibliotheken)
Wenn Sie Google Play Services verwenden, wählt das Plugin com.google.gms.google-services
die com.google.gms.google-services
Konfiguration selbst aus.
Wenn die Autoren der Bibliothek die Konfiguration nicht in das Archiv packen, haben sie sich möglicherweise darum gekümmert und die Regeln auf ihre Website, Repository-Seite oder in die README-Datei geschrieben. Versuchen Sie, die Konfiguration für die von Ihnen verwendete Version der Bibliothek selbst zu finden.
Wenn Sie nirgendwo vorgefertigte Regeln finden, müssen Sie die Protokolle lesen und das Problem einzeln lösen. Höchstwahrscheinlich müssen Sie Keep-Regeln für den fehlerhaften Bibliothekscode hinzufügen. Oder ignorieren Sie Fehler, wenn sie das Programm nicht beeinträchtigen.
Überprüfen Sie Ihren Code
Sie wissen besser, welchen Code Sie unter dem Messer senden können, sollten sich jedoch alle Stellen genau ansehen, an denen die Reflexion ohnehin verwendet wird:
- Class.forName (...) (die Dokumentation verspricht, dass Proguard in der Lage ist, solchen Code zu definieren, es gab jedoch Fälle, die es wert sind, überprüft zu werden)
- Modelle / Entitätsklassen, die bei der Serialisierung und Zuordnung verwendet werden. Alle Klassen, deren Feldnamen (manchmal die Klassen selbst) wichtig sind (Gson, RealmIO usw.)
- native Bibliotheksaufrufe über JNI
Tests
Wenn eine Klasse / Methode nur in Tests und nirgendwo anders verwendet wird, löscht Proguard diesen Code. Dies ist eine häufige Situation, wenn Sie TDD haben :) In diesem Fall habe ich eine separate Konfiguration, in der ich Klassen hinzufüge, die noch nicht in das Projekt integriert sind, nirgendwo verwendet werden, aber getestet werden müssen.
Im Android Gradle Plugin gibt es zusätzlich zu den Anweisungen für proguardFiles
noch testProguardFiles
. Diese Anweisung wird benötigt, um die Konfigurationen anzugeben, die auf die Testanwendung angewendet werden, die generiert wird, um Ihre Anwendung zu testen, wenn Sie Instrumentierungstests ausführen. Normalerweise wird dies verwendet, um die gleiche Optimierung / Verschleierung in beiden apk-Dateien zu erreichen, so dass keine Desynchronisation zwischen ihnen besteht. Link
APK Analyzer
Android Studio hat so ein tolles Tool. Sie können es entweder über Aktion suchen -> APK analysieren oder durch Öffnen der APK-Datei selbst in Android Studio öffnen. Analyzer zeigt viele nützliche Informationen, aber jetzt interessieren wir uns für den Code. Um zu sehen, was schließlich in eine APK-Datei classes.dex
, müssen Sie die Datei classes.dex
auswählen

Standardmäßig wird genau der resultierende Code angezeigt, der die Schritte zum Verkleinern und Optimieren bestanden hat. Sie können jedoch auf die Schaltfläche Load Proguard-Zuordnungen ... klicken, seeds.txt
und usage.txt
hinzufügen, um den gelöschten Code usage.txt
.

Wenn Proguard aus irgendeinem Grund den benötigten Code geändert hat, suchen Sie ihn in Analyzer und wählen Sie Proguard Keep Rule über RMB generieren . Analyzer generiert eine Auswahl verschiedener Optionen für die Regeln, von der allgemeinsten bis zur spezifischsten. Wählen Sie eine davon aus.


Für Bibliotheksautoren
Wenn Sie eine Android-Bibliothek erstellen, können Sie eine Proguard-Konfiguration für Ihre Clients wie folgt hinzufügen:
buildTypes { release { consumerProguardFiles 'proguard-rules.pro' } }
Meiner Meinung nach ist es besser, Ihre Bibliothek nicht eifrig zu optimieren und zu verschleiern, sondern Ihren Kunden diese Möglichkeit zu bieten. Ein guter Ton ist, der Konfiguration hinzuzufügen, was Kunden noch hinzufügen müssen, wenn sie Proguard enthalten. Wenn Sie dennoch Sicherheit hinzufügen möchten, müssen Sie natürlich die gesamte Pulic-API Ihrer Bibliothek vor Proguard schützen, einschließlich Deskriptoren und Signaturen.
R8, DexGuard und Redex
R8 ist das neue Tool von Google, das den aktuellen Proguard ersetzt. Warten Sie, versuchen Sie nicht, alles zu vergessen, was Sie gerade im Artikel gelesen haben. Behandeln Sie es einfach wie den neuen Proguard. Google verspricht, die gesamte öffentliche API beizubehalten, damit alle Konfigurationen wie zuvor funktionieren. Das Projekt befindet sich noch in der Beta-Phase, aber Sie können es selbst ausprobieren.
DexGuard ist ein kostenpflichtiges Dienstprogramm der Entwickler von Proguard. Es kann zusammen oder anstelle von Proguard verwendet werden. Es wird argumentiert, dass DexGuard alles kann, was Proguard kann, aber besser. Leider hatte ich keine Gelegenheit, es zu versuchen. Wenn jemand Erfahrung hat, teilen Sie diese bitte mit.
Redex ist ein weiterer Dex-Optimierer von Facebook. Es wird berichtet, dass Sie damit die Produktivität um bis zu 25% steigern und die Größe der Anwendung reduzieren können, indem Sie das Tool auf den bereits von Proguard verarbeiteten Code anwenden.
Anstelle einer Schlussfolgerung
Haben Sie keine Angst, Proguard zu verwenden, seien Sie nicht faul und verbringen Sie einige Zeit mit dem Einrichten. Dies reduziert die Größe, erhöht die Arbeitsgeschwindigkeit und erhöht die Loyalität Ihrer Benutzer. Versuchen Sie gleichzeitig, effektive Proguard-Konfigurationen zu erstellen, schreiben Sie keine "Teppich" -Regeln, sonst kommt ein wütender Jake Wharton zu Ihnen und schimpft mit Ihnen.

Ressourcen
Proguard-Website . Es gibt auch Informationen über DexGuard.
Verschiedene Beispielregeln
R8
Aufzeichnung einer Präsentation der Funktionsweise von Proguard mit DroidCon
Effektive ProGuard-Regeln für die Aufzeichnung von Präsentationen kleinerer Anwendungen (Google I / O '18)
Anweisungen zum Aktivieren und Konfigurieren von Proguard für Android
Wiki-Seite
Redex