使用 IntelliJ IDEA 开发 Android 应用程序时配置 All

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 所在目录内创建两个 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/>
    </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 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 default="你的module名字-obfuscated">

<property value="/你的project绝对路径/out/production/你的module名字"/>
    <property value="/你的project绝对路径/out/artifacts/你的module名字"/>

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/32d52858accfa791ea05c7b741b1b4bd.html