关于java:Android proguard,保持内部类

Android proguard, keep inner class

我的Android程序有一个class A,其中有两个static inner class。 发现在应用proguard后将它们从.dex中剥离。

1
2
3
4
5
6
7
8
9
10
11
public class A{

  ...
  static class B{
    ...
  }

  static class C{
    ...
  }
}

我在proguard.flags中添加了以下几行,但是似乎没有运气。

1
2
-keep class com.xxx.A
-keep class com.xxx.A$*

有什么提示吗?


尝试将InnerClasses添加到keep属性。例如:

1
-keepattributes Exceptions, InnerClasses, ...

另外,尝试将一个主体添加到带有星号的" keep"调用中,如下所示:

1
2
3
-keep class com.xxx.A$* {
    *;
}


这就是我要做的配置

1
2
3
-keep class com.xxx.A { *; }
-keep class com.xxx.A$B { *; }
-keep class com.xxx.A$C { *; }


这对我有用

1
2
3
4
5
-keepattributes InnerClasses
 -keep class com.yourpackage.YourClass**
 -keepclassmembers class com.yourpackage.YourClass** {
    *;
 }

通配符可能有点过大,但是我想确保自己没有错过任何东西。最主要的是,您需要InnerClasses属性(该属性保留在类中)和keepclassmembers(保留在类中)。


如果您不希望混淆某个包中的所有内部类和成员,则可以在proguard-rules.pro中添加行

1
2
3
    -keep class com.xxx.task.*$* {
        *;
    }


您的配置看起来正确。您应该仔细检查您是否没有拼写错误的类名。如果拼写错误,ProGuard应该打印出有关它的注释。您还可以指定-printseeds seeds.txt,并查看您的类是否在结果文件中列出。如果列出了这些类,则这些类也在处理后的代码中。

正如Alexander Lucas所提到的,您可能还希望保留这些类的字段和方法-这取决于您的要求。


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

1
2
3
4
5
6
7
-keepattributes Exceptions,InnerClasses,Signature, ...

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