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

我正在开发一个作为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’”

谢谢您的帮助!

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

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

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

这将只保留嵌套在MyConfigObject所有enum所需的成员 – 所需的成员是$VALUES[]数组(请参阅此问题以获得解释)以及枚举的任何public成员。 不会保留任何其他成员(例如私人领域方法)。


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

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