本文已受权微信公众号「玉刚说」独家发布。java
这篇「Java 混淆那些事」的第二篇,咱们先把咱们的测试环境以及用到的各类工具介绍一下,而后动手去尝试各类命令而且验证它们的效果,这样有助于咱们理解。git
首先须要在电脑上配置好 Java 环境。而后须要的主角 ProGuard,而后还有反编译软件 jadx。github
下载连接在下面。 ProGuard 下载地址 jadx 反编译工具 两个的工具有用下载地址sql
第一步:写出测试代码,打成一个 Jar 包(在文章结尾会介绍 intellij 和 Eclipse 怎么导出 jar 包)。 第二步:配置 ProGuard 的混淆规则 第三步:使用 jadx 去查看混淆完的类文件的内容。 第四步:一直重复上面三个步骤,搞明白具体的命令。bash
一、把下载的 ProGuard 解压,打开终端进入 proguard/bin 目录,输入 ./proguardgui.sh 打开 ProGuard 的 GUI 客户端。微信
Windows 电脑直接进入 proguard/bin 目录双击运行 proguardgui.bat 便可。注:须要 JDK 环境app
如图:点击 Load configuration 按钮能够读取配置文件。暂时忽略这个地方,等咱们有了配置文件或者须要编写混淆规则的时候,就能够在这里导入了。svn
二、咱们首先准备一个简单的 Java 项目的 Jar 包,在 Input/Output 选项卡,点击 Add input 设置须要混淆的 Jar 包,点击 Add output 设置类文件处理完成以后输出的位置。工具
注:Mac 版 GUI 有个 BUG,设置 output 时须要选定一个文件,而没有办法直接输入路径,咱们能够先把未混淆的 Jar 包复制一份改个名字,混淆完成以后他会自动覆盖 Jar 包。测试
三、切换到 Process 选项卡,直接点击 Process 便可输出处理以后的 Jar 到 output 目录。点击 Save configuration 按钮,能够保存配置文件,以 .pro、.txt 结尾便可。以后咱们就可以直接在配置文件中修改和编写混淆规则了。而后就经过第一步直接导入配置了。
以上虽然能够进行混淆,可是删除了哪一个类,那个方法,对哪一个方法改了名字等等,咱们都无从知晓。接下来咱们继续配置一下。接下来咱们配置一下这三个东西,来帮助咱们理解混淆过程。
usage.txt :通过压缩过程被删除的类、方法、字段。 mapping.txt :存储通过混淆过程,新旧类名、方法名、字段名的映射,软件发布必定要保留此文件,否则收集上来的报错信息,不知道具体是哪一个类或方法,你将会非常头疼。 seeds.txt :被 Keep 规则匹配到的类、方法、字段,来验证咱们的 keep 规则是否合咱们的需求。
点开 Shrinker 选项卡,在 Print usage 前面打钩,并选择 usage.txt 的输出路径。
点开 Obfuscator 选项卡,在 Print mapping 前面打钩,并选择 mapping.txt 的输出路径。
点开 Information 选项卡,在 Print seeds 前面打钩,并选择 seeds.txt 的输出路径。
经过上述方法保留的相关文件可以验证咱们的混淆规则,可是咱们调试起来比较麻烦而且不够直观,因此咱们使用一个开源工具 jadx 来观察混淆后的代码,来验证咱们的混淆规则。
解压下载完成后的 jadx.zip 而后进入 bin 目录,双击 jadx-gui 打开 jadx 软件。
Windows 双击 jadx-gui.bat 打开软件
能够打开混淆完成后 Jar 包,而后比较本身的源代码,查看不一样地方。
#输入须要混淆的 Jar
-injars JavaProGuardDemo.jar
#输出混淆完成的 Jar
-outjars 'JavaProGuardDemo 2.jar'
-libraryjars /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/jre/lib/rt.jar
# 打印 usage
-printusage usage.txt
# 打印 mapping
-printmapping mapping.txt
# 打印 seeds
-printseeds seeds.txt
# Keep - Applications. Keep all application classes, along with their 'main' methods.
-keepclasseswithmembers public class * {
public static void main(java.lang.String[]);
}
# Also keep - Enumerations. Keep the special static methods that are required in
# enumeration classes.
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# Also keep - Database drivers. Keep all implementations of java.sql.Driver.
-keep class * extends java.sql.Driver
# Also keep - Swing UI L&F. Keep all extensions of javax.swing.plaf.ComponentUI,
# along with the special 'createUI' method.
-keep class * extends javax.swing.plaf.ComponentUI {
public static javax.swing.plaf.ComponentUI createUI(javax.swing.JComponent);
}
# Keep - Native method names. Keep all native class/method names.
-keepclasseswithmembers,includedescriptorclasses,allowshrinking class * {
native <methods>;
}
...
复制代码
这是最基本的配置文件,除了写注释的那几句是咱们本身在 GUI 的操做中添加的,其它都是 ProGuard 本身默认添加的。
此方法只适用于最普通的 Java SE 项目,若是使用了 Maven 等工具,可使用 Maven 打包。
一、点击 File => Project Structure
二、点击 Artifacts 选项卡,而后点击 + 号
三、选择 JAR => From modules with dependencies...
四、选择 main 方法,而后点击 OK。
五、选择 Build => Build Artifacts...
六、选择 Build 便可
七、在项目根目录 out/artifacts/项目名_jar,就能够看到打包的 Jar 包了
一、在项目上点击右键,点击 Export
二、点开 java 选择 JAR file
三、选择 Jar 的存放位置点击 Finish 便可。