使用 IntelliJ IDEA 开发一般 Java 应用程序时通过 Allatori 进行代码混淆非常容易配置,下面总结一下本人经验,介绍一下配置方法。
首先在 IDEA 的 Module 所在硬盘目录内创建一个名为 allatori 的子目录,将 Allatori 自己的 jar 文件都复制到这个子目录下。然后在 IDEA 的 Module 所在目录内创建两个 XML 文件,一个是 Allatori 自己的混淆配置文件,命名为 config-allatori.xml;另一个是用于 Ant 构建的配置文件,命名为 build-allatori.xml。首先看 config-allatori.xml 文件的内容,基本可以作为一个模板:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <config> 3 <jars> 4 <jar in="${artifact}" out="${artifact-obfuscated}"/> 5 </jars> 6 7 <classpath> 8 <jar name="lib/mysql-connector-java-5.1.30-bin.jar"/> 9 <jar name="lib/netty-all-4.0.18.Final.jar"/> 10 <jar name="../lib/jgoodies-common.jar"/> 11 <jar name="../lib/jgoodies-forms.jar"/> 12 <jar name="../lib/jna-platform.jar"/> 13 <jar name="../lib/jna.jar"/> 14 </classpath> 15 16 <keep-names> 17 <class template="class Launcher"> 18 <field access="private+"/> 19 <method template="private+ *(**)"/> 20 </class> 21 <class template="interface MacCameraDataCallback"> 22 <method template="private+ *(**)"/> 23 </class> 24 <class template="interface MacCameraErrorCallback"> 25 <method template="private+ *(**)"/> 26 </class> 27 <class template="interface MacCameraCaptureNativeLibrary"> 28 <method template="private+ *(**)"/> 29 </class> 30 </keep-names> 31 32 <property name="log-file" value="log.xml"/> 33 </config>
这里我的 Module 中有标准 Java 类,也有接口。含有 main 方法的启动类 Launcher 不应被混淆,接口也不应被混淆,因为涉及到 JNA 的本地方法映射调用,所以这里显示了如何在 Allatori 混淆配置中进行相应设置的方法。同时注意,由于我这个 Module 除了使用自己专有的第三方库以外,还使用了 Module 所在项目的项目全局第三方库,所以在上面的混淆配置的 <classpath> 小节部分可以看到必须指定准确的第三方库相对或绝对路径用于编译混淆。因为开发一般 Java 应用程序,不必像 Android 应用程序那样把第三方库一同打进目标应用程序 jar 文件中,第三方库的 jar 文件编译后也是单独存在的,所以混淆配置中不必指定第三方库的类防止混淆。
下面再来看 build-allatori.xml 文件的内容,也可以作为一个模板:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project name="MacCameraCaptureTest-allatori" default="MacCameraCaptureTest-obfuscated"> 3 <property name="out.classes.absolute.dir" value="/Users/Dolphin/Develop/idea/PCCameraCaptureInteractivity/out/production/MacCameraCaptureTest"/> 4 <property name="out.jar.absolute.dir" value="/Users/Dolphin/Develop/idea/PCCameraCaptureInteractivity/out/artifacts/MacCameraCaptureTest_jar"/> 5 6 <property name="artifact" value="${out.jar.absolute.dir}/MacCameraCaptureTest.jar"/> 7 <property name="artifact-obfuscated" value="${out.jar.absolute.dir}/MacCameraCaptureTest-obfuscated.jar"/> 8 9 <target name="MacCameraCaptureTest-obfuscated"> 10 <taskdef name="allatori" classname="com.allatori.ant.ObfuscatorTask" classpath="allatori/allatori.jar"/> 11 <allatori config="config-allatori.xml"/> 12 </target> 13 14 <target name="MacCameraCaptureTest-clean"> 15 <delete dir="${out.classes.absolute.dir}"/> 16 <delete dir="${out.jar.absolute.dir}"/> 17 </target> 18 </project>
这里主要是注意,${out.classes.absolute.dir} 以及 ${out.classes.absolute.dir}-obfuscated 所定义的 IDEA 针对项目 Module 编译产生的目标类文件以及 jar 文件所在路径一定要准确。
然后我们就要将 build-allatori.xml 加入到 IDEA 的 Ant Build 系统中,如下图所示:
点击 IDEA 右上部分 Ant Build 那个按钮,在弹出的 Dock 小窗口中点击“+”按钮,然后选择 build-allatori.xml 文件即可将其加入到 IDEA 的 Ant Build 系统中。
接下来,我们进入到 IDEA 的 Project Structure 配置中,创建好 Module 的 Artifacts,在其 Artifacts 的具体属性配置中,需要指定其 Post-processing 使用 build-allatori.xml 中定义的名为“你的module名字-obfuscated”的 target(我这里是 MacCameraCaptureTest-obfuscated),如下图所示:
注意红色区域里面,要把 Run Ant target 前面勾选中,然后点击其右边的“...”按钮,会出现选择窗口,你需要选择 build-allatori.xml 中定义的名为“你的module名字-obfuscated”的 target(我这里是 MacCameraCaptureTest-obfuscated)。
之后,点击 IDEA 菜单“Build”->“Build Artifacts...”菜单项并选择“Build”命令来进行 Module 的编译构建即可。你会在 Module 的 Artifact 生成目录下看到两个 jar 文件,其中一个名为“你的Module名字-obfuscated.jar”的文件(我这里是 MacCameraCaptureTest-obfuscated.jar),那就是混淆以后的 jar 文件了;不带“-obfuscated”后缀的 jar 文件是没有混淆的版本。
另外注意,如果需要清理 Module 已生成的类文件及 jar(包括混淆版本),可以通过 IDEA 的 Ant Build 执行 build-allatori.xml 中定义的“你的module名字-clean” target,就可以彻底清除它们。