【问题标题】:Android proguard, keep inner classAndroid proguard,保持内部类
【发布时间】:2012-12-13 03:37:17
【问题描述】:

我的安卓程序有一个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$*

有什么提示吗?

【问题讨论】:

  • 对我来说,这是因为我的内部类正在实现 API 16+ 中引入的接口。一旦我从 implements 中删除了该接口,我的内部类就开始在 pre-API 16 中正常工作。

标签: java android proguard


【解决方案1】:

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

-keepattributes Exceptions, InnerClasses, ...

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

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

【讨论】:

  • 你能发布更多你的 proguard.flags 文件吗?我不想一直猜测那里已经有什么了:)
  • 嗨,我正在修改android框架,所以它和github.com/dzo/build/blob/master/core/proguard.flags一样,加上-keepattributes和我上面的修改。
  • 明白了。添加了另一个可能有帮助的项目。
【解决方案2】:

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

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

【讨论】:

  • 这对我有用。我几乎有了这个解决方案,但不得不从语句中删除单词public,即使外部类和内部类都是公共的。奇怪而令人困惑。
【解决方案3】:

这对我有用

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

使用通配符可能有点矫枉过正,但我​​想确保没有遗漏任何内容。主要的是你需要类的keep和类的keepclassmembers的InnerClasses属性。

【讨论】:

  • 这一行“-keepclassmembers com.yourpackage.YourClass**”应改为“-keepclassmembers class com.yourpackage.YourClass**”
  • 可以合并最后两行。仅当您不将类本身作为入口点时,keepclassmembers 才有意义
【解决方案4】:

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

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

【讨论】:

  • 什么是task*$*
  • task 是包名的一部分,而 $ 是该类中的内部类
【解决方案5】:

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

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

【讨论】:

【解决方案6】:

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

-keepattributes Exceptions,InnerClasses,Signature, ...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多