Ein gängiges Muster in ProGuard-Konfigurationen für Android-Anwendungen besteht darin, benutzerdefinierte View
-Klassen beizubehalten, da sie wahrscheinlich nur aus Layout-XML anstelle von Anwendungscode referenziert werden.
Bei der Projekterstellung fügt der ADT diese Regeln daher der proguard.cfg eines Projekts hinzu:
%Vor% Ich denke, die Idee hier ist zu sagen, dass, wann immer eine Klasse einen Konstruktor definiert, der von einem Layout-Inflator aufgerufen werden kann, dann behalte es bei. Laut den ProGuard-Dokumenten ist das keepclasseswithmembernames
-Qualifikationsmerkmal jedoch eine Abkürzung für keepclasseswithmembers
und allowshrinking
, was, wenn ich es richtig verstehe, bedeutet, dass diese Klassen entfernt werden dürfen, aber wenn sie beibehalten werden, verschleiern sie diese nicht Mitgliedsnamen (wahrscheinlich um Bindungen zwischen XML-Attributnamen und Klasseneinstellern nicht zu trennen).
Bedeutet das aber nicht, dass diese Klassen während der Schrumpfphase immer noch entfernt werden (allowhrinking = true), sofern sie nicht direkt im Code referenziert werden? Genau das ist mit einem benutzerdefinierten Widget passiert, das wir in unserer App verwenden, und ich könnte das Problem beheben, indem ich die Regel auf nur keepclasseswithmembers
setze, da dies die übereinstimmenden Klassen vollständig erhält (es ist erwähnenswert, dass dies das ist Das offizielle ProGuard Android-Beispiel funktioniert auch.
Lese ich die ProGuard-Dokumentation falsch oder ist das ein Fehler im ADT-Projektassistenten?
Die Konfiguration im Android SDK (zumindest bis Version 11) ist in der Tat nicht ganz korrekt.
Die Konfiguration für Android in der ProGuard Dokumentation spezifiziert korrekt "-keepclasseswithmembers", nicht "-keepclasseswithmembernames" ".
Als ich zum ersten Mal den integrierten Progard mit Ant ausprobierte, stürzte meine App ständig mit Laufzeitfehlern auf den Clickhandlern ab. (Ich setze diese immer in XML). Ich nahm an, dass ich etwas falsch machen musste, was ich nicht herausfinden konnte, also fügte ich die Zeile hinzu
%Vor%oben in der proguard.cfg.
Vielleicht ist das nicht optimal, aber es hat die Laufzeitfehler gestoppt!
Nachtrag
Tatsächlich habe ich das in der usage.txt überprüft. Die clickhandlers wurden dort aufgelistet, bevor ich die Option dontshrink hinzufügte, nachdem ich sie hinzugefügt hatte, war usage.txt wie erwartet leer.
Tags und Links android proguard obfuscation minimization