1、下载Proguard

官网地址:http://proguard.sourceforge.net/(不墙很难打开)


链接: https://pan.baidu.com/s/1c2kReQ8 密码: iepp

2、准备好你要混淆的jar包

3、启动Proguard

解压proguard,执行 bin目录下的proguardgui.bat

java proguard 混淆效果 proguard混淆war包_Proguard混淆方法


4、选择输入输出和jar包支持

点击左边“input/output”菜单,然后点击右边的“Add input”按钮,添加需要混淆的jar包。
然后点击“add output”,选择输出的路径和包名。

java proguard 混淆效果 proguard混淆war包_java proguard 混淆效果_02

下面开始添加支持库。
程序引用的所有jar包以
jre下面的所有jar
servlet.jar等
其他:例如web容器(tomcat等)中需要用到的jar包
把以上所有的jar都copy到一个文件夹中,点击右边的“add”,进行添加。
PS:默认会带一个rt.jar,注意不要重复。

5、配置

除了java版本,和keep开头的选项,其他基本不用改。关键是后面手动修改的部分。

java proguard 混淆效果 proguard混淆war包_java proguard 混淆效果_03


java proguard 混淆效果 proguard混淆war包_java proguard 混淆效果_04


java proguard 混淆效果 proguard混淆war包_java proguard 混淆效果_05


java proguard 混淆效果 proguard混淆war包_Proguard混淆JAVA代码_06


java proguard 混淆效果 proguard混淆war包_Proguard混淆jar_07

6、修改配置文件(重点)

点击save保存

java proguard 混淆效果 proguard混淆war包_Proguard混淆JAVA代码_08

修改配置文件,主要是keep(keep混淆会造成问题的class)

具体配置方法,请参照:

java proguard 混淆效果 proguard混淆war包_Proguard混淆方法_09

回到欢迎界面,重新加载修改后的配置文件

java proguard 混淆效果 proguard混淆war包_Proguard混淆JAVA代码_10

切换到Process菜单,点击View查看修改是否生效。如果没有生效请重启Proguard再次首页重新加载配置文件

java proguard 混淆效果 proguard混淆war包_Proguard混淆jar_11

7、混淆

点击Process键混淆,成功如下。

java proguard 混淆效果 proguard混淆war包_Proguard混淆工具_12


这里可能会出现一系列错误,需要自己根据提示解决

例如最常见的

1、缺少jar包,检查第四步添加的jar包是否齐全

2、N个class混淆出错,检查class是否有编译错误,检查jar包路径是否为正常jar包,实在不行使用keep不进行混淆


8、配置说明

参数: 


-include {filename}    从给定的文件中读取配置参数 


-basedirectory {directoryname}    指定基础目录为以后相对的档案名称 


-injars {class_path}    指定要处理的应用程序jar,war,ear和目录 


-outjars {class_path}    指定处理完后要输出的jar,war,ear和目录的名称 


-libraryjars {classpath}    指定要处理的应用程序jar,war,ear和目录所需要的程序库文件 


-dontskipnonpubliclibraryclasses    指定不去忽略非公共的库类。 


-dontskipnonpubliclibraryclassmembers    指定不去忽略包可见的库类的成员。 




保留选项 

-keep {Modifier} {class_specification}    保护指定的类文件和类的成员 


-keepclassmembers {modifier} {class_specification}    保护指定类的成员,如果此类受到保护他们会保护的更好


-keepclasseswithmembers {class_specification}    保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。 


-keepnames {class_specification}    保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除) 


-keepclassmembernames {class_specification}    保护指定的类的成员的名称(如果他们不会压缩步骤中删除)


-keepclasseswithmembernames {class_specification}    保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后) 


-printseeds {filename}    列出类和类的成员-keep选项的清单,标准输出到给定的文件 


 


压缩 

-dontshrink    不压缩输入的类文件 


-printusage {filename} 


-whyareyoukeeping {class_specification}     


 


优化 


-dontoptimize    不优化输入的类文件 


-assumenosideeffects {class_specification}    优化时假设指定的方法,没有任何副作用 


-allowaccessmodification    优化时允许访问并修改有修饰符的类和类的成员 


 


混淆 

-dontobfuscate    不混淆输入的类文件 


-printmapping {filename} 


-applymapping {filename}    重用映射增加混淆 


-obfuscationdictionary {filename}    使用给定文件中的关键字作为要混淆方法的名称 


-overloadaggressively    混淆时应用侵入式重载 


-useuniqueclassmembernames    确定统一的混淆类的成员名称来增加混淆 


-flattenpackagehierarchy {package_name}    重新包装所有重命名的包并放在给定的单一包中 


-repackageclass {package_name}    重新包装所有重命名的类文件中放在给定的单一包中 


-dontusemixedcaseclassnames    混淆时不会产生形形色色的类名 


-keepattributes {attribute_name,...}    保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses. 


-renamesourcefileattribute {string}    设置源文件中给定的字符串常量