Proguard 不会保留类成员的枚举

2022-09-01 15:38:27

我正在研究一个作为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'”

感谢您的帮助!


答案 1

请尝试。Proguard 类规范期望作为内部类的分隔符。com.stuff.MyConfigObject$MyEnum$

实际上,对于你想要的,也许最好的选择是这样的:

-keep public enum com.stuff.MyConfigObject$** {
    **[] $VALUES;
    public *;
}

这将仅保留所有 s 的必需成员嵌套在其中 - 所需成员是数组(有关说明,请参阅此问题)和枚举的任何成员。任何其他成员(例如私有字段方法)将不会保留。enumMyConfigObject$VALUES[]public


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

例如,在处理库时,至少应保留“异常”、“内部类”和“签名”属性。


答案 2

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

-keep class * {
    public enum **;
}

它使我免于在proguard配置中编写123枚举中的每一个。

另外,不要忘记您是否正在处理库-keepAttributes