使用 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 混淆时暴露内部类的主要内容,如果未能解决你的问题,请参考以下文章