【发布时间】:2016-07-21 15:58:07
【问题描述】:
我目前正在使用一个使用大量反射的 Android 库。
只要我启用 proguard 并运行它...它就会崩溃。
为什么?它使用了大量的反射,并且这些方法仅通过反射调用,因此它们被 proguard 检测为未使用并在收缩过程中被删除,因此抛出了 NoSuchMethodError。
为什么会这样?这很容易弄清楚它们在收缩过程中被删除,因为 proguard 认为它们未被使用,因此删除了那段代码(所有方法)
那么,如何配置 proguard 以避免缩小或混淆整个包? (图书馆)
注意:我不想使用 -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)
...
请注意,问题在于内部内部类...
我目前的配置是这样的:
-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$*$* { *; }
但这显然只能避免混淆收缩过程中未删除的方法... 我需要避免在收缩过程中删除方法。
【问题讨论】:
-
不是重复的。我正在专门寻找一种方法来禁用其他答案无法解决的收缩(以及其他答案确实回答的混淆)。
-
为什么全局-dontshrink 这么可怕。你需要你的应用程序缩小。萎缩是否值得它目前给你带来的痛苦?
-
为什么我应该仅仅因为一个库使用反射就停止缩小我的应用程序?我可以,但这只是简单的方法。
标签: android proguard android-proguard