首先在 IDEA 的 Android Module 所在硬盘目录内创建一个名为 allatori 的子目录,将 Allatori 自己的 jar 文件都复制到这个子目录下。然后在 IDEA 的 Android Module 所在目录内创建两个 XML 文件,一个是 Allatori 自己的混淆配置文件,命名为 config-allatori.xml;另一个是用于 Ant 构建的配置文件,命名为 build-allatori.xml。首先看 config-allatori.xml 文件的内容,基本可以作为一个模板:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<jars>
<dir in="${out.classes.absolute.dir}" out="${out.classes.absolute.dir}-obfuscated"/>
</jars>
<classpath>
<jar name="libs/netty/netty-all-4.0.19.Final.jar"/>
</classpath>
<keep-names>
<class template="public class * instanceof android.app.Activity">
<method template="public void *(android.view.View)"/>
</class>
<class template="public class * instanceof android.app.Application"/>
<class template="public class * instanceof android.app.Service"/>
<class template="public class * instanceof android.view.View">
<method template="public void set*(**)"/>
</class>
<class template="public class * instanceof android.content.BroadcastReceiver"/>
<class template="public class * instanceof android.content.ContentProvider"/>
<class template="public class * instanceof android.app.backup.BackupAgentHelper"/>
<class template="public class * instanceof android.preference.Preference"/>
<class template="public class com.android.vending.licensing.ILicensingService"/>
<class template="public class com.google.android.vending.licensing.ILicensingService"/>
<class template="class * implements android.os.Parcelable">
<field template="public static final android.os.Parcelable$Creator *"/>
</class>
<class template="class io.netty.*">
<field access="private+"/>
<method template="private+ *(**)"/>
</class>
</keep-names>
<property name="log-file" value="log.xml"/>
</config>
这里要注意第 4 行,${out.classes.absolute.dir} 以及 ${out.classes.absolute.dir}-obfuscated 都是在 build-allatori.xml 中自定义的变量,用来表示 IDEA 编译 Android Module 源代码生成的 java class 类文件(字节码)所在目录以及类文件被混淆后保存的目录。第 7 至 9 行表示 Android Module 中引用的第三方库所在类路径,有多个第三方库 jar 文件就要有对应的多行类路径说明。第 30 至 33 行表示第三方库中的类不应被混淆,通过指定包名前缀及通配符来限定,如果有多个第三方类库,就要有多个类似这样的声明。
下面再来看 build-allatori.xml 文件的内容,也可以作为一个模板:
<?xml version="1.0" encoding="UTF-8"?>
<project name="你的module名字-allatori" default="你的module名字-obfuscated">
<property name="out.classes.absolute.dir" value="/你的project绝对路径/out/production/你的module名字"/>
<property name="out.jar.absolute.dir" value="/你的project绝对路径/out/artifacts/你的module名字"/>
<target name="你的module名字-obfuscated">
<taskdef name="allatori" classname="com.allatori.ant.ObfuscatorTask" classpath="allatori/allatori.jar"/>
<allatori config="config-allatori.xml"/>
<delete dir="${out.classes.absolute.dir}"/>
<move todir="${out.classes.absolute.dir}">
<fileset dir="${out.classes.absolute.dir}-obfuscated"/>
</move>
</target>
<target name="你的module名字-clean">
<delete dir="${out.classes.absolute.dir}"/>
<delete dir="${out.jar.absolute.dir}"/>
<delete dir="${out.classes.absolute.dir}-obfuscated"/>
</target>
</project>
你需要将 build-allatori.xml 中“你的module名字”字样部分全都改为你的 Android Module 的实际名字,将“你的project绝对路径”字样部分全都改为你的 project 的绝对路径。下面将 build-allatori.xml 加入进 IDEA 的 Ant Build 中,如下图所示:
点击 IDEA 右上部分 Ant Build 那个按钮,在弹出的 Dock 小窗口中点击“+”按钮,然后选择 build-allatori.xml 文件即可将其加入到 IDEA 的 Ant Build 系统中。
然后在 IDEA 的 Project Stucture 配置中,创建好 Android Module 的 Artifacts,在其 Artifacts 的具体属性配置中,需要指定其 Pre-processing 使用 build-allatori.xml 中定义的名为“你的module名字-obfuscated”的 target,如下图所示:
注意红色区域里面,要把 Run Ant target 前面勾选中,然后点击其右边的“...”按钮,会出现选择窗口,你需要选择 build-allatori.xml 中定义的名为“你的module名字-obfuscated”的 target。
之后,点击 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.xml 中定义的“你的module名字-clean” target,就可以彻底清除已生成的类文件目录及 APK 所在目录。