我正在使用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文件时,我找不到该类。
我错过了什么吗?为什么映射告诉我它不保留这个类?
答案 0 :(得分:21)
您需要使用正确的表示法指定要保留内部类。
用proguard说法,这意味着-keep class my.outer.Class$MyInnerClass
。这里的关键是使用美元符号($
)作为内部类和外部类之间的分隔符。
为此,您还必须指定-keepattributes InnerClasses
,以便名称MyInnerClass
不会被混淆。这两个设置一起应该允许你的内部类保持不变。
答案 1 :(得分:1)
选项keepclassmembers
仅保留指定的类成员(及其名称)。
您可能想要更常见的选项keep
,它会保留指定的类和类成员(及其名称)。