2012-08-24 78 views
6

我正試圖學習如何使用ProGuard,它不像我想象的那麼容易。起初,我發現了一個簡單的Java代碼來試用它,一個簡單的two class Swing calculator如何使用ProGuard?

該代碼可以通過下面的鏈接找到,但我發現它太詳細發佈它在這裏。無論如何,這是一個簡單的應用程序,入口點在Calc.main(),沒有軟件包。

然後我編譯兩個來源:

$ javac *.java 

並創建了.jar文件(因爲它看起來的ProGuard只能用罐子工作):

$ jar cvef Calc calc.jar *.class 
added manifest 
adding: Calc.class(in = 3869) (out= 2126)(deflated 45%) 
adding: Calc$ClearListener.class(in = 468) (out= 327)(deflated 30%) 
adding: CalcLogic.class(in = 1004) (out= 515)(deflated 48%) 
adding: Calc$NumListener.class(in = 1005) (out= 598)(deflated 40%) 
adding: Calc$OpListener.class(in = 1788) (out= 1005)(deflated 43%) 

寫命名obfuscate.pro ProGuard的文件:

-injars  calc.jar 
-outjars  calc_obf.jar 
-libraryjars <java.home>/lib/rt.jar 

-keep public class Calc extends javax.swing.JFrame { 
public static void main(java.lang.String[]); 
} 

最後運行ProGuard:

$ ~/progs/proguard/proguard4.8/bin/proguard.sh @obfuscate.pro 
ProGuard, version 4.8 
Reading program jar [/home/lucas/tmp/calc.jar] 
Reading library jar [/usr/lib/jvm/java-7-openjdk-i386/jre/lib/rt.jar] 
Error: The output jar is empty. Did you specify the proper '-keep' options? 

好吧,顯然沒有工作。我厭倦了與ProGruard參數混淆,特別是-keep選項,但沒有成功。我在與我的問題相關的文檔中找到的所有內容都無法幫助我。然後我訴諸於你...什麼是錯的?如何做到這一點?

+0

你的'main'方法是大寫的,這幾乎肯定不是。 –

+0

@LouisWasserman對,修正。仍然有同樣的問題。 – lvella

+0

這對我來說很好。你能上傳你的jar和你的ProGuard配置嗎,所以我們可以測試解決方案,而不是猜測你電腦上可能出現了什麼問題? –

回答

4

我得到了它使用下面的配置文件的工作:

-injars  calc.jar 
-outjars  calc_obf.jar 
-libraryjars <java.home>/lib/rt.jar 
-keep class Calc { 
    public static void main(java.lang.String[]); 
} 

最值得注意的是,在我的面前class Calc拋棄了public

1

我有類似的問題,通過取出Java修飾符解決。

爪哇改性劑如能見度改性劑是在 ProGuard的配置文件-keep選項可選的(以及相關-keepclassmembers選項等)

從手冊: -keep [,改性劑,...] class_specification

因此,除非有其他特殊原因,否則您可以將它們排除在外。