我正在开发一个以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'”
感谢您的帮助!
答案 0 :(得分:35)
请尝试使用com.stuff.MyConfigObject$MyEnum
。 Proguard class specification期望$
作为内部类的分隔符。
实际上,对于你想要的东西,最好的选择可能是这样的:
-keep public enum com.stuff.MyConfigObject$** {
**[] $VALUES;
public *;
}
这将只保留嵌套在enum
内的所有MyConfigObject
所需的成员 - 所需成员为$VALUES[]
数组(有关解释,请参阅this question) public
枚举的成员。
正如Jesse和我在评论中所指出的那样 - 由于您正在处理库,因此您还必须添加-keepAttributes
选项。参考指南:
例如,在处理库时,至少应保留Exceptions,InnerClasses和Signature属性。
答案 1 :(得分:0)
要保留所有内部枚举,请尝试以下操作:
-keep class * {
public enum **;
}
它使我免于编写Proguard配置中的123个枚举。
此外,如果您正在处理库,请不要忘记-keepAttributes