我试着学习如何使用proguard,但这并不像我想的那么容易。起初我找到了一个简单的java代码来尝试它,一个简单的两类swing计算器。
这个代码可以通过下面的链接找到,但是我发现它太冗长了,无法在这里发布。不管怎样,它是一个简单的应用程序,入口点是打开的 Calc.main()
,没有包。
然后我编译了两个源代码:
$ javac *.java
创造了 .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%)
编写了名为 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[]);
}
最后运行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?
好吧,显然没用。我厌倦了和prograard参数打交道,尤其是那个 -keep
选择,没有成功。我在文件中找到的所有与我的问题有关的东西都帮不了我。那我就求助于你。。。怎么了?如何做好?
3条答案
按热度按时间8ulbf1ek1#
我使用以下配置文件使其工作:
最值得注意的是,我抛弃了
public
在前面class Calc
.z18hc3ub2#
我也遇到过类似的问题,可以通过去掉java修饰符来解决。
java修饰符(如可见性修饰符)在proguard配置文件-keep选项(以及相关选项-keepclassmembers等)中是可选的
来自手册:-保持[,修饰符,…]等级规范
所以除非有特别的原因,否则你可以把它们排除在外。
tgabmvqs3#
这是gradle的解决方案
创建一个可运行的jar,将所有依赖库复制到“dependencies”目录,并在清单中添加类路径。
复制依赖项
用proguard混淆图书馆
这是完整的构建.gradle
proguard.conf文件
用于混淆的gradle命令