7

我正在使用 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 文件时,我找不到该类。

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

4

2 回答 2

22

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

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

于 2011-11-24T11:16:16.327 回答
1

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

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

参照。ProGuard 手册 > 使用 > Keep 选项概述

于 2011-11-25T10:54:44.117 回答