2016-04-01 2 views
2

Ich verwende derzeit eine Android-Bibliothek, die viel Reflexion verwendet.Proguard: Wie kann verhindert werden, dass ein ganzes Paket schrumpft (und verschleiert), um zu vermeiden, dass "unbenutzte Methoden" entfernt (und verschleiert) werden?

Sobald ich Proguard aktivieren, und es ausführen ... es stürzt ab.

Warum? Es wird viel Reflexion verwendet und die Methoden werden nur über Reflektion aufgerufen, so dass sie von proguard als unbenutzt erkannt und während des Schrumpfprozesses entfernt werden, so dass eine NoSuchMethodError geworfen wird.

Warum das passiert? Das ist einfach, herauszufinden sie während des Schrumpfprozesses entfernt werden als proguard hält sie ungenutzt sind und entfernt daher, dass Teile des Codes (alle Methoden)

So wie kann ich proguard konfigurieren zu vermeiden Schrumpfen oder Verschleiern ein ganzes Paket? (die Bibliothek)

Hinweis: Ich möchte die Option -dontshrink nicht verwenden, da es alles oder nichts ist und ich nur ein bestimmtes Paket vermeiden möchte.


Weitere Informationen:

Der Laufzeitfehler ist die folgende:

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.my.app.debug, PID: 3771 
java.lang.NoSuchMethodError: observeValueForKeyPath [class java.lang.String, class java.lang.Object, class com.my.lib.util.Dictionary, class java.lang.Object] 
at com.my.lib.util.Observable$ObservationManager$Observer.<init>(SourceFile:47) 
at com.my.lib.util.Observable$ObservationManager$Observer.<init>(SourceFile:26) 
at com.my.lib.util.Observable$ObservationManager.addObserver(SourceFile:159) 
... 

Beachten Sie, dass das Problem einer eine innere innere Klasse ist ...

Mein aktueller Konfiguration hat etwas wie:

-keep,includedescriptorclasses class com.my.** { *; } 
-keepclassmembers class com.my.lib** { *; } 
-keep,includedescriptorclasses class com.my.lib.util.Observable$* { *; } 
-keep,includedescriptorclasses class com.my.lib.util.Observable$*$* { *; } 

Aber das vermeidet offenbar nur die Verschleierung der Methoden, die nicht während des Schrumpfprozesses entfernt wurden ... Ich muss vermeiden, Methoden während des Schrumpfens zu entfernen.

+0

Mögliches Duplikat von [Wie zu halten/einen bestimmten Paket Pfad auszuschließen, wenn proguard mit?] (Http://stackoverflow.com/questions/4830474/how-to-keep-exclude-a-particular-package -path-when-using-proguard) – Elltz

+0

Es ist kein Duplikat.Ich suche speziell nach einer Möglichkeit, Schrumpfung zu deaktivieren, die die andere Antwort nicht löst (und die Verschleierung, die die andere Antwort tatsächlich beantwortet). – neteinstein

+0

Warum ist das globale -tonshrink so schrecklich. Brauchst du ** deine App geschrumpft? Ist das Schrumpfen den Schmerz wert, den es gerade verursacht? –

Antwort

2

Nach dem documentation-keep sollte auch funktionieren, wenn schrumpfen, während -keepclassmembers funktioniert nur, „wenn [die] Klassen als gut erhalten sind“.

+0

Eigentlich hast du recht. Ich habe etwas anderes falsch gemacht. – neteinstein

0
-keep class com.library.** { *; } 
+0

Dies funktioniert nicht, da das Schrumpfen die Methoden entfernt, die nicht verwendet werden. Es hält also nur die nicht verschleierten, die als verwendet erkannt werden. Die Reflektion wird nicht in der Kompilierungszeit erkannt. – neteinstein

+0

true, Ihre Frage hat die Spezifität der Reflektionsnutzung nicht erwähnt. Aber ja, Sie haben Recht, – gaara87

+0

Weitere Informationen hinzugefügt, um mit den Antworten zu helfen. – neteinstein

0

Im Interesse der Menschen in Zukunft mit ähnlichen Problemen werde ich erklären, was wirklich geschah:

  1. Die -keep class my.app.package wirklich Methoden vermied durch Schrumpfen und verschleierten entfernt werden (@ F43nd1r Antwort gemacht Ich realisiere, dass, indem man wirklich darauf hinweist, dass die Dokumente sagten, dass es auch Schrumpfung zu vermeiden), so das Problem woanders war

  2. Nach dem Dekompilieren der Lib-Code und Weitergabe einige Zeit beim Lesen, fand ich, dass es als Parameter eine Instanz von erhalten eine andere Klasse (nicht von dieser lib) und eine Zeichenfolge mit einem Methodennamen t Hat es für die Reflexion verwendet. Das war das Problem, ich musste auch vermeiden, diese Klasse zu verschleiern.

Verwandte Themen