68

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

public class A{

  ...
  static class B{
    ...
  }

  static class C{
    ...
  }
}

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

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

有什么提示吗?

4

6 回答 6

70

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

-keepattributes Exceptions, InnerClasses, ...

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

-keep class com.xxx.A$* {
    *;
}
于 2012-12-27T19:26:56.160 回答
59

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

-keep class com.xxx.A { *; }
-keep class com.xxx.A$B { *; }
-keep class com.xxx.A$C { *; }
于 2013-06-18T04:53:40.397 回答
10

这对我有用

-keepattributes InnerClasses
 -keep class com.yourpackage.YourClass**
 -keepclassmembers class com.yourpackage.YourClass** {
    *;
 }

通配符可能有点矫枉过正,但我​​想确保我没有错过任何东西。主要的是你需要类的内部类属性和类的keepclassmembers。

于 2013-06-23T02:07:11.217 回答
9

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

    -keep class com.xxx.task.*$* {
        *;
    }
于 2015-06-09T01:19:54.340 回答
5

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

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

于 2012-12-29T10:35:24.370 回答
0

大多数最佳答案都可以完成这项工作,但他们使用通配符(*;)来添加所有不是准确答案的内容。下面的配置仅添加fieldsmethod属性以保留内部类方法。

-keepattributes Exceptions,InnerClasses,Signature, ...

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

于 2020-06-08T15:48:52.373 回答