2011-06-08 74 views
17

我正在开发一个作为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'“

感谢您的帮助!

回答

31

尝试com.stuff.MyConfigObject$MyEnum代替。 Proguard class specification预计$作为内部类的分隔符。

其实,你想要的东西,也许是最好的选择是这样的:

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

这将只保留了嵌套在MyConfigObject所有enum S中的所需的成员 - 所需的成员作为$VALUES[]阵列(见this question作为解释)和任何public成员的枚举。任何其他成员(如私人领域的方法)将不会被保留。


正如在评论中所指出的杰西和我 - 因为你正在处理一个库,你还必须添加-keepAttributes选项。从参考指南:

For example, you should at least keep the Exceptions, InnerClasses, and Signature attributes when processing a library.

+0

谢谢,让我更加接近!但是,生成的.jar有点奇怪。枚举的类文件在那里,一切看起来都不错,但在Eclipse中,没有任何成员可以使用。代码完成显示它们是正确的,但编译仍然失败,“MyEnum无法解析或不是字段。”我使用的是proguard 4.4。 – Jesse 2011-06-09 14:24:39

+2

我发现如果你添加'-keepAttributes **'它会起作用。不确定必须保留哪些特定属性,但是使用[Proguard参考](http://proguard.sourceforge.net/manual/usage.html#keepattributes)以及一些实验,我敢打赌你可以弄明白。 – 2011-06-09 20:47:38

+0

谢谢@Kevin K,你是一个拯救生命的人。奇迹般有效! – Jesse 2011-06-13 14:29:27