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

首先在 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 所在目录。

IntelliJ IDEA 的详细介绍请点这里
IntelliJ IDEA 的下载地址请点这里

猜你喜欢

转载自www.linuxidc.com/Linux/2015-12/126097.htm