使用 ProGuard 混淆时暴露内部类

Posted

技术标签:

【中文标题】使用 ProGuard 混淆时暴露内部类【英文标题】:Exposing inner classes when obfuscating with ProGuard 【发布时间】:2010-11-13 00:47:44 【问题描述】:

我正在使用 Ant 任务用 ProGuard 混淆一个库。

当它们具有特定的注释 (@ApiAll) 时,我会保留特定的类名及其方法名,并且我要求保留 InnerClasses 属性:

  <keepattribute name="InnerClasses" />
  <keep annotation="com.example.ApiAll"/>
  <keepclassmembers annotation="com.example.ApiAll">
     <constructor access="public protected"/>
     <field access="public  protected"/>
     <method access="public  protected"/>
     <constructor access="protected"/>
    </keepclassmembers>

如果我检查映射输出文件,我可以看到具有注释的内部类及其成员保持其名称不被混淆。但是,当我查看生成的 jar 文件时,我找不到该类。

我错过了什么吗?为什么映射告诉我它没有保留这个类?

【问题讨论】:

【参考方案1】:

您需要指定要使用正确的符号保留内部类。 在 proguard 用语中,这意味着 -keep class my.outer.Class$MyInnerClass。这里的关键是使用美元符号 ($) 作为内部类和外部类之间的分隔符。

为此,您还必须指定-keepattributes InnerClasses,以便名称MyInnerClass 不会被混淆。这两个设置一起应该可以让你的内部类保持不变。

【讨论】:

这是 yGuard 相同问题的正确答案【参考方案2】:

keepclassmembers 选项仅保留指定的类成员(及其名称)。

您可能想要更常见的选项keep,它保留指定的类类成员(及其名称)。

参照。 ProGuard manual > Usage > Overview of Keep Options

【讨论】:

以上是关于使用 ProGuard 混淆时暴露内部类的主要内容,如果未能解决你的问题,请参考以下文章

Proguard 不会保留班级成员的枚举

proguard 不混淆第三方jar包的问题

Proguard 保留公共类、字段和方法

Proguard 问题“警告:忽略匿名内部类的 InnerClasses 属性”

Proguard 混淆时保持类“实现”

Android 混淆后的代码调试