Android proguard,保持内部类

Dav*_*uan 55 java android proguard

我的android程序有一个class A,有两个static inner class.发现它们.dex在应用proguard后被剥离.

public class A{

  ...
  static class B{
    ...
  }

  static class C{
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

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

-keep class com.xxx.A
-keep class com.xxx.A$*
Run Code Online (Sandbox Code Playgroud)

任何提示?

Ale*_*cas 63

尝试添加InnerClasseskeep属性.例如:

-keepattributes Exceptions, InnerClasses, ...
Run Code Online (Sandbox Code Playgroud)

另外,尝试使用星号向"保持"调用添加正文,如下所示:

-keep class com.xxx.A$* {
    *;
}
Run Code Online (Sandbox Code Playgroud)

  • `-keep class com.xxx.A $*{*; 对我有用 (11认同)

ajm*_*jma 42

这是我必须为我的配置做的事情

-keep class com.xxx.A { *; }
-keep class com.xxx.A$B { *; }
-keep class com.xxx.A$C { *; }
Run Code Online (Sandbox Code Playgroud)


Gam*_*tes 10

这对我有用

-keepattributes InnerClasses
 -keep class com.yourpackage.YourClass**
 -keepclassmembers class com.yourpackage.YourClass** {
    *;
 }
Run Code Online (Sandbox Code Playgroud)

这可能与通配符有点过分,但我想确保我没有错过任何东西.主要的是你需要保持类的InnerClasses属性和类上的keepclassmembers.

  • 您可以合并最后两行。仅当您不同时将类本身作为入口点时,keepclassmembers才有意义 (2认同)

Mr2*_*235 7

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

    -keep class com.xxx.task.*$* {
        *;
    }
Run Code Online (Sandbox Code Playgroud)


Eri*_*une 5

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

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