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


问题内容

我正在开发一个以java
jar形式分发的库,并且在proguard上运行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 *;
}

这将仅将所有enums
的必需成员嵌套在其中MyConfigObject-必需成员是$VALUES[]数组(请参阅此问题以获取解释)和public枚举的任何成员。任何其他成员(例如私有字段方法)将不会保留。


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

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