我如何使用ProGuard?

lve*_*lla 7 java command-line proguard

我试图学习如何使用ProGuard,这并不像我想象的那么容易.起初我发现了一个简单的Java代码来尝试它,一个简单的两类Swing计算器.

可以通过以下链接找到代码,但我发现在这里发布它太冗长了.无论如何,它是一个带入口点的普通应用程序,Calc.main()没有包.

然后我编译了两个来源:

$ javac *.java
Run Code Online (Sandbox Code Playgroud)

并创建了该.jar文件(因为看起来ProGuard只适用于jar):

$ 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%)
Run Code Online (Sandbox Code Playgroud)

写了名为的ProGuard文件obfuscate.pro:

-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[]);
}
Run Code Online (Sandbox Code Playgroud)

最后运行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?
Run Code Online (Sandbox Code Playgroud)

好吧,显然没有用.我厌倦了弄乱ProGruard参数,特别是那些-keep选项,没有成功.我在与我的问题相关的文档中找到的所有内容都无法帮助我.然后我求助于你......出了什么问题?怎么做对了?

Lou*_*man 5

我使用以下配置文件使其工作:

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

最值得注意的是,我抛弃了public前方class Calc.