2012-08-24 118 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

因此,除非有其他特殊原因,否则您可以将它们排除在外。