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

时间:2011-06-08 21:41:53

标签: java enums proguard

我正在开发一个以java jar形式发布的库,我正在运行proguard,只留下暴露所需的接口。我有一个配置类,包含一堆成员变量和一些枚举定义。我的proguard脚本保留了成员变量,但枚举定义正在被混淆。我已经尝试了所有我能想到的东西来强制proguard保留这些内部定义和公共枚举,但我无法让它工作。

现在我正在使用:

-keep public class com.stuff.MyConfigObject {
    public *;
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

如果我尝试:

-keep public enum com.stuff.MyConfigObject.MyEnum

我收到了一个含糊不清的错误: “注意:配置引用未知类'com.stuff.MyConfigObject.MyEnum'”

感谢您的帮助!

2 个答案:

答案 0 :(得分:35)

请尝试使用com.stuff.MyConfigObject$MyEnum。 Proguard class specification期望$作为内部类的分隔符。

实际上,对于你想要的东西,最好的选择可能是这样的:

-keep public enum com.stuff.MyConfigObject$** {
    **[] $VALUES;
    public *;
}

这将只保留嵌套在enum内的所有MyConfigObject所需的成员 - 所需成员为$VALUES[]数组(有关解释,请参阅this questionpublic枚举的成员。

,不会保留任何其他成员(例如私人字段方法)

正如Jesse和我在评论中所指出的那样 - 由于您正在处理库,因此您还必须添加-keepAttributes选项。参考指南:

  

例如,在处理库时,至少应保留Exceptions,InnerClasses和Signature属性。

答案 1 :(得分:0)

要保留所有内部枚举,请尝试以下操作:

-keep class * {
    public enum **;
}

它使我免于编写Proguard配置中的123个枚举。

此外,如果您正在处理库,请不要忘记-keepAttributes