2011-06-08 64 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