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

Jes*_*sse 22 java enums proguard

我正在开发一个作为java jar分发的库,我正在运行proguard,以便只暴露所需的接口.我有一个配置类,包含一堆成员变量和一些枚举定义.我的proguard脚本保留了成员变量,但枚举定义正在被混淆.我已经尝试了所有我能想到的强迫proguard保留这些内部定义和公共枚举,但我无法让它工作.

现在我正在使用:

-keep public class com.stuff.MyConfigObject {
    public *;
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试:

-keep public enum com.stuff.MyConfigObject.MyEnum
Run Code Online (Sandbox Code Playgroud)

我得到一个模棱两可的错误:"注意:配置引用未知类'com.stuff.MyConfigObject.MyEnum'"

谢谢您的帮助!

Kev*_*n K 38

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

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

-keep public enum com.stuff.MyConfigObject$** {
    **[] $VALUES;
    public *;
}
Run Code Online (Sandbox Code Playgroud)

这将只保留所有enum嵌套在MyConfigObject其中的所需成员 - 所需成员是$VALUES[]数组(请参阅此问题以获得解释)和public枚举的任何成员.不会保留任何其他成员(例如私人领域方法).


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

例如,在处理库时,至少应保留Exceptions,InnerClasses和Signature属性.

  • 感谢领导,我在-keepattributes的文档中发现了这一点:"例如,在处理库时,至少应该保留Exceptions,InnerClasses和Signature属性." (3认同)
  • 我发现如果你添加`-keepAttributes**`它会起作用.不确定必须保留哪个特定属性,但是使用[Proguard参考](http://proguard.sourceforge.net/manual/usage.html#keepattributes)和一些实验我打赌你可以搞清楚. (2认同)