我正在以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 class specification期望$
作为内部类的分隔符。
实际上,对于您想要的,也许最好的选择是这样的:
-keep public enum com.stuff.MyConfigObject$** {
**[] $VALUES;
public *;
}
这将仅将所有enum
的所需成员嵌套在MyConfigObject
中-所需成员为$VALUES[]
数组(有关说明,请参见this question)和枚举的任何public
成员。其他任何成员(例如私有字段方法)将不会保留。
正如Jesse和我本人在评论中指出的-由于您正在处理库,因此还必须添加-keepAttributes
选项。从参考指南中:
例如,在处理库时,至少应保留Exceptions,InnerClasses和Signature属性。
要保留所有内部枚举,请尝试以下操作:
-keep class * {
public enum **;
}
它使我免于编写Proguard配置中的123个枚举。
此外,如果正在处理库,请不要忘记-keepAttributes