Proguard:如何避免缩小(和混淆)整个包,以避免删除(和混淆)"未使用的方法"?

时间:2016-04-01 18:16:36

标签: android proguard android-proguard

我目前正在使用一个使用大量反射的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$*$* { *; }

但这显然只是避免混淆在收缩过程中没有删除的方法...... 我需要避免在缩小过程中删除方法

4 个答案:

答案 0 :(得分:2)

According to the documentation -keep should work even when shrinking, while -keepclassmembers only works "if [the] classes are preserved as well".

答案 1 :(得分:0)

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

答案 2 :(得分:0)

为了将来有类似问题的人,我会解释到底发生了什么:

  1. -keep class my.app.package真的避免了通过缩小和混淆来删除的方法(@ F43nd1r的回答让我意识到通过真正指出文档说它避免也在缩小),所以问题出在其他地方

  2. 在反编译lib的代码并传递一些时间读取它之后,我发现它作为参数接收了另一个类的实例(不是来自该lib)和一个带有用于反射的方法名称的字符串。这就是问题所在,我还需要避免混淆那个课程。

答案 3 :(得分:0)

我使用选项-dontshrink来防止缩小。 来源:link