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 *;
}
这将仅将所有enum
s
的必需成员嵌套在其中MyConfigObject
-必需成员是$VALUES[]
数组(请参阅此问题以获取解释)和public
枚举的任何成员。任何其他成员(例如私有字段方法)将不会保留。
正如Jesse和我本人在评论中指出的那样-由于您正在处理库,因此您还必须添加该-keepAttributes
选项。从参考指南中:
例如,在处理库时,至少应保留Exceptions,InnerClasses和Signature属性。