Proguard:如何避免缩小(和混淆)整个包以避免删除(和混淆)"unused methods"?
Proguard: How to avoid shrinking (and obfuscating) an entire package to avoid removing (and obfuscating) "unused methods"?
我目前正在使用一个使用大量反射的 Android 库。
我一启用混淆器,运行 它就崩溃了。
为什么?它使用了大量的反射,并且这些方法仅通过反射调用,所以它们被混淆器检测为未使用并在收缩过程中被删除,因此抛出一个 NoSuchMethodError
。
为什么会这样?这很容易弄清楚 它们在缩小过程中被删除,因为混淆器认为它们未被使用,因此删除了那段代码(所有方法)
那么,我如何配置混淆器以避免缩小或混淆整个包? (图书馆)
注意:我不想使用 -dontshrink 选项,因为它是全有或全无,我只想避免使用特定的包。
更多信息:
运行时间错误如下:
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)
...
请注意问题是一个内在的内在class...
我当前的配置是这样的:
-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$*$* { *; }
但这显然只是避免混淆在收缩过程中未删除的方法... 我需要避免在收缩过程中删除方法。
-keep class com.library.** { *; }
根据 documentation -keep
即使在收缩时也应该工作,而 -keepclassmembers
只工作 "if [the] classes are preserved as well"。
为了以后遇到类似问题的人,我会解释一下到底发生了什么:
-keep class my.app.package
确实避免了通过缩小和混淆来删除的方法(@F43nd1r 的回答让我意识到,通过真正指出文档说它也避免了缩小),所以问题出在别处
在反编译 lib 的代码并花了一些时间阅读它之后,我发现它作为参数接收到另一个 class 的实例(不是来自那个 lib)和一个带有它用于反射的方法名称。这就是问题所在,我还需要避免混淆 class.
我使用选项 -dontshrink
来防止收缩。
资料来源:link
我目前正在使用一个使用大量反射的 Android 库。
我一启用混淆器,运行 它就崩溃了。
为什么?它使用了大量的反射,并且这些方法仅通过反射调用,所以它们被混淆器检测为未使用并在收缩过程中被删除,因此抛出一个 NoSuchMethodError
。
为什么会这样?这很容易弄清楚 它们在缩小过程中被删除,因为混淆器认为它们未被使用,因此删除了那段代码(所有方法)
那么,我如何配置混淆器以避免缩小或混淆整个包? (图书馆)
注意:我不想使用 -dontshrink 选项,因为它是全有或全无,我只想避免使用特定的包。
更多信息:
运行时间错误如下:
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)
...
请注意问题是一个内在的内在class...
我当前的配置是这样的:
-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$*$* { *; }
但这显然只是避免混淆在收缩过程中未删除的方法... 我需要避免在收缩过程中删除方法。
-keep class com.library.** { *; }
根据 documentation -keep
即使在收缩时也应该工作,而 -keepclassmembers
只工作 "if [the] classes are preserved as well"。
为了以后遇到类似问题的人,我会解释一下到底发生了什么:
-keep class my.app.package
确实避免了通过缩小和混淆来删除的方法(@F43nd1r 的回答让我意识到,通过真正指出文档说它也避免了缩小),所以问题出在别处在反编译 lib 的代码并花了一些时间阅读它之后,我发现它作为参数接收到另一个 class 的实例(不是来自那个 lib)和一个带有它用于反射的方法名称。这就是问题所在,我还需要避免混淆 class.
我使用选项 -dontshrink
来防止收缩。
资料来源:link