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

问题描述 投票:22回答:2

我正在以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'”]

感谢您的帮助!

java enums proguard
2个回答
38
投票

改为尝试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属性。


0
投票

要保留所有内部枚举,请尝试以下操作:

-keep class * {
    public enum **;
}

它使我免于编写Proguard配置中的123个枚举。

此外,如果正在处理库,请不要忘记-keepAttributes

© www.soinside.com 2019 - 2024. All rights reserved.