我的Android程序有class A
,有两个static inner class
。发现它们在应用proguard后被.dex
剥离。
public class A{
...
static class B{
...
}
static class C{
...
}
}
我在proguard.flags中添加了以下几行,但似乎没有运气。
-keep class com.xxx.A
-keep class com.xxx.A$*
任何提示?
答案 0 :(得分:54)
尝试将InnerClasses
添加到保留属性。 e.g:
-keepattributes Exceptions, InnerClasses, ...
另外,尝试使用星号向“keep”调用添加正文,如下所示:
-keep class com.xxx.A$* {
*;
}
答案 1 :(得分:37)
这是我必须为配置做的事情
-keep class com.xxx.A { *; }
-keep class com.xxx.A$B { *; }
-keep class com.xxx.A$C { *; }
答案 2 :(得分:8)
这对我来说很有把戏
-keepattributes InnerClasses
-keep class com.yourpackage.YourClass**
-keepclassmembers class com.yourpackage.YourClass** {
*;
}
这可能与通配符有点过分,但我想确保我没有错过任何东西。最重要的是你需要保持类的InnerClasses属性和类上的keepclassmembers。
答案 3 :(得分:7)
如果您不希望某些包中的所有内部类和成员被混淆,您可以在proguard-rules.pro中添加行
-keep class com.xxx.task.*$* {
*;
}
答案 4 :(得分:4)
您的配置看起来是正确的。您应该仔细检查您是否没有拼写错误的类名。如果拼写错误,ProGuard应该打印出关于它的说明。您还可以指定-printseeds seeds.txt
,并查看您的类是否列在结果文件中。如果列出它们,则类也在处理过的代码中。
正如Alexander Lucas所提到的,您可能还想保留这些课程的字段和方法 - 这取决于您的要求。
答案 5 :(得分:0)
大多数最重要的答案都能胜任,但是他们使用通配符(*;)
来添加所有不正确答案的内容。下面的配置仅添加fields
和method
属性以保留内部类方法。
-keepattributes Exceptions,InnerClasses,Signature, ...
# preserve class and nested classes' fields and methods
-keep class com.abc.package.clazzes.** {
<fields>;
<methods>;
}