Android ist offiziell Dokumentation bewahren zeigt zwei primäre Optimierungen:
- einstellen
minifyEnabled
zu true
- verwenden
proguard-android-optimize.txt
Anstatt von proguard-android.txt
Sind diese beiden die aggressivsten möglichen Einstellungen?
Ich schreibe eine Android-Bibliothek und muss sicherstellen, dass mein Code nicht kaputt geht, wenn Leute meine Bibliothek verwenden. (Ich weiß, dass es Regeln gibt, die ich in meine Bibliothek einfügen kann, um der Proguard-Konfiguration entgegenzuwirken, die in der App festgelegt ist, die die Bibliothek verwendet, aber ich möchte das nicht tun, wenn ich nicht muss.)
Denken Sie daran, dass die beste ProGuard-Konfiguration eine Konfiguration mit einem Minimum an Ausnahmen ist. Unter den Ausnahmen verstehe ich:
-keepclassmembers class * extends android.content.Context {
public void *(android.view.View);
public void *(android.view.MenuItem);
}
Lassen Sie uns proguard-android-optimize.txt durchgehen und uns die Optimierungs-/Verschleierungsoptionen ansehen.
Für eine detaillierte Beschreibung der von mir verwendeten ProGuard-Optionen Dies
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
Dies – Liste möglicher Optimierungen, ! bedeuten negieren, also wird diese Optimierung nicht verwendet
-optimizationpasses 5
Gibt die Anzahl der durchzuführenden Optimierungsdurchläufe an. Standardmäßig wird ein einzelner Durchgang durchgeführt. Mehrere Durchgänge können zu weiteren Verbesserungen führen. Wenn nach einem Optimierungsdurchlauf keine Verbesserungen gefunden werden, wird die Optimierung beendet. Gilt nur beim Optimieren.
Verwendungszweck: OKund es sieht so aus, als ob die standardmäßigen 5 Durchgänge ausreichen
-allowaccessmodification
Gibt an, dass die Zugriffsmodifikatoren von Klassen und Klassenmitgliedern während der Verarbeitung erweitert werden können. Dies kann die Ergebnisse des Optimierungsschritts verbessern.
Verwendungszweck: OKja sieht aus wie eine Verbesserung der Optimierung
-dontpreverify
Wenn Sie auf Android abzielen, ist eine Vorverifizierung nicht erforderlich, also schalten Sie sie mit dontpreverify aus, um die Verarbeitungszeit etwas zu verkürzen. Diese Option wirkt sich jedoch nicht auf die Unzerbrechlichkeit des Codes aus.
Verwendungszweck: OKnur um die Verarbeitungszeit ein wenig zu reduzieren
-dontusemixedcaseclassnames
Gibt an, dass beim Verschleiern keine Klassennamen mit gemischter Groß-/Kleinschreibung generiert werden sollen. Standardmäßig können verschleierte Klassennamen eine Mischung aus Groß- und Kleinbuchstaben enthalten. Dadurch entstehen vollkommen akzeptable und verwendbare Gläser.
Verwendungszweck: FRAGLICHich kann keinen genauen Grund finden, warum diese Option hinzugefügt wurde, aber sieht so aus, als würde man den Klassennamen ändern von abcdef
zu AbCdEf
macht Code nicht unknackbar
-dontskipnonpubliclibraryclasses
Gibt an, dass nicht-öffentliche Bibliotheksklassen nicht ignoriert werden sollen. Ab Version 4.5 ist dies die Standardeinstellung.
Verwendungszweck: OKsehr hilfreich
Die folgenden Optionen sind nicht in proguard-android-optimize.txt enthalten:
-mergeinterfacesaggressively
Gibt an, dass Schnittstellen zusammengeführt werden können, auch wenn ihre implementierenden Klassen nicht alle Schnittstellenmethoden implementieren … Das Setzen dieser Option kann die Leistung des verarbeiteten Codes auf einigen JVMs verringern
Verwendungszweck: SCHLECHTfür Android gefährlich aussehen, nicht in die Konfiguration aufgenommen, Zusammenfassung des Verbots von Klassen/Zusammenführungen/in Optimierungen
-overloadaggressively
Gibt an, beim Verschleiern eine aggressive Überladung anzuwenden. Mehrere Felder und Methoden können dann dieselben Namen erhalten, solange ihre Argumente und Rückgabetypen unterschiedlich sind, wie es der Java-Bytecode erfordert (nicht nur ihre Argumente, wie es die Java-Sprache erfordert).
Verwendungszweck: SCHLECHTdie Dalvik-VM von Google kann keine überladenen statischen Felder verarbeiten.
Ich kenne also nur eine weitere nützliche und ungefährliche Option zur Verschleierung:
-repackageclasses ''
-repackageclasses ''
Gibt an, dass alle umbenannten Klassendateien neu gepackt werden sollen, indem sie in das einzelne angegebene Paket verschoben werden. Ohne Argument oder mit einem leeren String (”) wird das Paket vollständig entfernt. Diese Option überschreibt die Option -flattenpackagehierarchy.
Verwendungszweck: OKWird von Google verwendet, also sieht es so aus, als hätten wir zumindest die Option gefunden, die wir unserer Konfiguration hinzufügen können
Bitte beachten Sie auch die Dekodierung von Stacktraces. ProGuard entfernt auch den Dateinamen und die Zeilennummern aus dem Stacktrace. Das macht die Fehlersuche sehr kompliziert. Sie können die Zeilennummern beibehalten, indem Sie Ihrer Konfiguration den folgenden Code hinzufügen:
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
Dadurch werden die Zeilennummern beibehalten, aber der Dateiname im Stacktrace durch “SourceFile” ersetzt.
Vergessen Sie auch nicht, dass der ProGuard da angreifbar aussieht Die String-Ressourcen werden nicht verschlüsseltziehen Sie also die Verwendung von DexGuard in Betracht oder verschlüsseln Sie wichtige Zeichenfolgen (wie Token, URLs) selbst.
Laut dem Kommentar aus der Optimierungsdatei bringen die Optimierungen gewisse Risiken mit sich und wenn sie verwendet werden, muss die App gründlich getestet werden. Nach meiner Erfahrung ist es notwendig, Code/Vereinfachung/Erweitert zu deaktivieren, da dies dazu führte, dass endgültige lokale Variablen, die außerhalb eines Lambda initialisiert wurden, innerhalb des Lambda NULL waren. Es war sehr schwierig zu debuggen und zu finden. Daher sind meine Optimierungseinstellungen wie folgt:
-Optimierungen !code/simplification/cast,!code/simplification/advanced,!field/*,!class/merging/*,!method/removal/parameter,!method/propagation/parameter
Beachten Sie, dass Code/Vereinfachung/Arithmetik ebenfalls deaktiviert werden müssen, wenn Sie auf Android 2.0 und niedriger abzielen (was sehr unwahrscheinlich ist). Außerdem musste ich auch method/removal/parameter und method/propagation/parameter deaktivieren, da diese implizit code/simplification/advanced aktivieren (siehe ProGuard-Handbuch Für mehr Information).
In libminecraft 1.15.2 Zero, der ersten Minecraft-Version, die die fortschrittliche Technologie der neuen libminecraft-Gesamtprogrammoptimierung verwendet, habe ich nur gson-, Inlining- und Code-Optimierungen verwendet. Dies geschieht, um die potenziell destabilisierenden Auswirkungen der Verwendung der vollständigen Optimierung abzuschwächen.
Jetzt hatten wir Minecraft 1.16.2 und ProGuard 7.0.0, ich habe vollständige Optimierungen ohne Stabilitätsprobleme verwendet (ich habe ProGuard tatsächlich mit Allatori gestapelt und bin immer noch nicht auf Stabilitätsprobleme gestoßen, da Allatori bessere Steuerungs- und Datenflussoptimierungen als ProGuard bietet).
Ich habe ProGuard dreimal in libminecraft 1.16.2 heavy ausgeführt. Einmal mit nur 5 Durchläufen von Codeoptimierungen, einmal mit allen Nicht-Codeoptimierungen und einmal mit nur 2 Durchläufen von Codeoptimierungen. Außerdem habe ich Allatori für den letzten Optimierungsdurchgang verwendet, da es sehr hochwertige Kontroll- und Datenflussoptimierungen durchführt.
Werden Sie Ihre Bibliothek bei jcenter hochladen? Weil ich nicht glaube, dass ProGuard in diesem Fall einen Einfluss haben wird. Sie können sich einige der Bibliotheken ansehen, die bereits großartig funktionieren – Materialdialoge. Oder einfach mal vorbeischauen android-arsenal.com
– Sufian
12. Februar 2016 um 7:10 Uhr
Ich wünschte, jeder Bibliotheksautor würde sich so sehr um ProGuard kümmern. Meistens mussten wir die ProGuard-Regeln für Bibliotheken von Drittanbietern selbst herausfinden.
– Kodo
12. Februar 2016 um 18:14 Uhr
Ich bin gespannt, was Sie von dieser Frage erwarten. Eine externe Ressource? Eine Empfehlung? Technisch gesehen könnte Ihre Frage mit “Ja” oder “Nein” beantwortet werden, aber ich vermute, Sie suchen nach mehr?
– Doug Stevenson
19. Februar 2016 um 6:05 Uhr
Ich hoffe auf 1. Ja, hier ist, wie es weiter optimiert werden kann ODER 2. Nein, hier ist ein logischer Beweis dafür, warum nicht, oder eine glaubwürdige Quelle, die sagt, dass es nicht geht.
– lf215
19. Februar 2016 um 6:30 Uhr