使用ProGuard进行混淆时暴露内部类

问题描述:

我使用Ant任务使用ProGuard对库进行混淆。使用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文件时,我找不到该类。

我错过了什么吗?为什么映射告诉我它保持这个课程,当它不是?

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

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

+0

感谢Markus。这帮助我解决了我的问题 – Fenil 2016-01-15 11:54:04

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

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

Cfr。 ProGuard manual > Usage > Overview of Keep Options