Android proguard,保持内部类

时间:2012-12-27 19:07:21

标签: java android proguard

我的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$*

任何提示?

6 个答案:

答案 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)

大多数最重要的答案都能胜任,但是他们使用通配符(*;)来添加所有不正确答案的内容。下面的配置仅添加fieldsmethod属性以保留内部类方法。

-keepattributes Exceptions,InnerClasses,Signature, ...

# preserve class and nested classes' fields and methods
-keep class com.abc.package.clazzes.** {
    <fields>;
    <methods>;
}