你的位置:首页 > Java教程

[Java教程]使用 IntelliJ IDEA 开发 Android 应用程序时配置 Allatori 进行代码混淆


IntelliJ IDEA 提供了非常强大的 Android 开发支持,就连 Google 官方推荐的 Android Studio 其实也是 IntelliJ IDEA 的一个 Android 开发专用版。因为 Android 程序发布时采用 APK 文件封装格式,其内部仍然是虚拟机字节码,是可以通过诸如 dex2jar、jd 等工具进行反编译的,所以进行产品发布前都要经过字节码混淆,以最大限度地保护软件知识产权。而 Google 官方推荐的 ProGuard 混淆器的混淆效果又不尽如人意,因此各类专业的混淆器并应运而生,这里面 Allatori 便是佼佼者。Allatori 是商业混淆器软件,混淆强度非常高,但其最新版官方网站上给出的与 Android Studio 的集成方式,采用的是 gradle 构建工具配置模式,经过实际测试并不成功。而 Allatori 自己的文档中描述了如何与 Ant 构建工具进行配合,因此还是考虑在 IntelliJ IDEA 中实现 Allatori 与 Android 开发的自动化配合问题。

首先在 IDEA 的 Android Module 所在硬盘目录内创建一个名为 allatori 的子目录,将 Allatori 自己的 jar 文件都复制到这个子目录下。然后在 IDEA 的 Android Module 所在目录内创建两个

 1 <??> 2 <config> 3   <jars> 4     <dir in="${out.classes.absolute.dir}" out="${out.classes.absolute.dir}-obfuscated"/> 5   </jars> 6  7   <classpath> 8     <jar name="libs/netty/netty-all-4.0.19.Final.jar"/> 9   </classpath>10 11   <keep-names>12     <class template="public class * instanceof android.app.Activity">13       <method template="public void *(android.view.View)"/>14     </class>15     <class template="public class * instanceof android.app.Application"/>16     <class template="public class * instanceof android.app.Service"/>17     <class template="public class * instanceof android.view.View">18       <method template="public void set*(**)"/>19     </class>20     <class template="public class * instanceof android.content.BroadcastReceiver"/>21     <class template="public class * instanceof android.content.ContentProvider"/>22     <class template="public class * instanceof android.app.backup.BackupAgentHelper"/>23     <class template="public class * instanceof android.preference.Preference"/>24     <class template="public class com.android.vending.licensing.ILicensingService"/>25     <class template="public class com.google.android.vending.licensing.ILicensingService"/>26     <class template="class * implements android.os.Parcelable">27       <field template="public static final android.os.Parcelable$Creator *"/>28     </class>29 30     <class template="class io.netty.*">31       <field access="private+"/>32       <method template="private+ *(**)"/>33     </class>34   </keep-names>35 36   <property name="log-file" value="log./>37 </config>

这里要注意第 4 行,${out.classes.absolute.dir} 以及 ${out.classes.absolute.dir}-obfuscated 都是在 build-allatori.

下面再来看 build-allatori.

 1 <??> 2 <project name="你的module名字-allatori" default="你的module名字-obfuscated"> 3  4   <property name="out.classes.absolute.dir" value="/你的project绝对路径/out/production/你的module名字"/> 5   <property name="out.jar.absolute.dir" value="/你的project绝对路径/out/artifacts/你的module名字"/> 6  7   <target name="你的module名字-obfuscated"> 8     <taskdef name="allatori" classname="com.allatori.ant.ObfuscatorTask" classpath="allatori/allatori.jar"/> 9     <allatori config="config-allatori./>10     <delete dir="${out.classes.absolute.dir}"/>11     <move todir="${out.classes.absolute.dir}">12       <fileset dir="${out.classes.absolute.dir}-obfuscated"/>13     </move>14   </target>15 16   <target name="你的module名字-clean">17     <delete dir="${out.classes.absolute.dir}"/>18     <delete dir="${out.jar.absolute.dir}"/>19     <delete dir="${out.classes.absolute.dir}-obfuscated"/>20   </target>21 </project>

你需要将 build-allatori.

点击 IDEA 右上部分 Ant Build 那个按钮,在弹出的 Dock 小窗口中点击“+”按钮,然后选择 build-allatori.

然后在 IDEA 的 Project Stucture 配置中,创建好 Android Module 的 Artifacts,在其 Artifacts 的具体属性配置中,需要指定其 Pre-processing 使用 build-allatori.

注意红色区域里面,要把 Run Ant target 前面勾选中,然后点击其右边的“...”按钮,会出现选择窗口,你需要选择 build-allatori.

之后,点击 IDEA 菜单“Build”->“Build Artifacts...”菜单项并选择“Build”命令来进行 Android APK 的编译构建,然后记住要再次执行 Build Artifacts 的 Build(千万不能是 Rebuild!)命令,实现混淆并重新构建 APK。即,通过两次 Build Artifacts 的 Build 命令来实现编译混淆构建 APK。其原理是,第一次 Build 时,在编译生成 class 类文件后,会自动调用 Allatori 对 class 类文件进行混淆,但第一次 Build 生成 APK 仍然是基于未混淆的类文件的。所以第二次 Build 时,因为已编译并被混淆的类文件已存在,不用再重新编译,IDEA 会直接利用已混淆的类文件构建 APK,从而实现混淆构建 APK 的目的。

另外注意,如果需要清理 Android Module 已生成的类文件及 APK,可以通过 IDEA 的 Ant Build 执行 build-allatori.