Android ProGuard: Aggressivste Optimierungen

Lesezeit: 6 Minuten

Benutzer-Avatar
lf215

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.)

  • 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

Benutzer-Avatar
AndreiICE

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.

  • Für Bibliotheksverwalter ist es wichtig zu beachten, dass -allowaccessmodification dazu führen kann, dass einige Ihrer versteckten Methoden/Mitglieder/Klassen offengelegt (öffentlich) werden, was wahrscheinlich nicht das ist, was Sie tun möchten.

    – Bilko

    12. April um 4:30 Uhr

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).

Benutzer-Avatar
Jessie Lesben

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.

1245260cookie-checkAndroid ProGuard: Aggressivste Optimierungen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy