使用 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 所在目录内创建两个 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 开发 Android 应用程序时配置 Allatori 进行代码混淆的更多相关文章
- 使用 IntelliJ IDEA 开发一般 Java 应用程序时配置 Allatori 进行代码混淆
使用 IntelliJ IDEA 开发一般 Java 应用程序时通过 Allatori 进行代码混淆非常容易配置,下面总结一下本人经验,介绍一下配置方法. 首先在 IDEA 的 Module 所在硬盘 ...
- 在 NetBeans 中开发一般 Java 应用程序时配置 Allatori 进行代码混淆
要在 NetBeans 中开发一般 Java 应用程序时利用 Allatori 进行代码混淆,设置比 IntelliJ IDEA 稍微简单一点,首先在 NetBeans 项目所在硬盘目录内创建一个名为 ...
- 用 Eclipse 开发 Android 应用程序
转自:http://www.apkbus.com/android-13828-1-1.html 开始之前 本教程介绍如何在 Eclipse 环境中进行 Android 应用程序开发,包括两个示例应用程 ...
- [原] Intellij IDEA开发Android,祝还在使用eclipse的早日脱离苦海
注: 现在推荐使用Android Studio,以后google在Android Studio上个性差异化的东西越来越多, 所以越早使用Android Studio越好,看看更新文档,使我们开发更方便 ...
- Unity开发Android应用程序:调用安卓应用程序功能
开发环境: Eclipse3.4 + adt12 + jdk6 + AndroidSDK2.2 Unity3.4 + windows7 测试设备: HTC Desire HD 本文要涉及到的几个重点问 ...
- C#使用Xamarin开发Android应用程序 -- 系列文章
Xamarin开发Android应用程序 利用Xamaria构建Android应用-公交发车信息屏 Xamarin版的C# SVG路径解析器 C#使用Xamarin开发可移植移动应用(1.入门与Xam ...
- 使用jQuery Mobile + PhoneGap 开发Android应用程序(转)
使用jQuery Mobile + PhoneGap 开发Android应用程序(转) 一.简介 jQuery Mobile是jQuery在手机上和平板设备上的版本.jQuery Mobile 不仅给 ...
- 用Eclipse开发Androd应用程序时,自带虚机模拟器太慢了,怎么办
问:用Eclipse开发Androd应用程序时,系统自带模拟器太慢了,怎么办? 答:用Genymotin
- 26.使用IntelliJ IDEA开发Java Web项目时,修改了JSP后刷新浏览器无法及时显示修改后的页面
转自:https://blog.csdn.net/yuxxz/article/details/51318908 使用IntelliJ IDEA开发Java Web项目时,修改了JSP后刷新浏览器无法及 ...
随机推荐
- redis cluster 配置
#服务器192.168.56.111 192.168.56.112 192.168.56.113 计划1主2从 192.168.56.111 192.168.56.112 192.168.56.1 ...
- http 基础与通讯原理
目录 http 基础与通讯原理 Internet 与中国 1990年10月 注册CN顶级域名 1993年3月2日 接入第一根专线 1994年4月20日 实现与互联网的全功能连接 1994年5月21日 ...
- 03Qt信号与槽(2)
1. 元对象工具 元对象编译器 MOC(meta object compiler)对 C++ 文件中的类声明进行分析并产生用于初始化元对象的 C++ 代码,元对象包含全部信号和槽的名字及指向这些函 ...
- destoon 信息发布表单提交验证
sell 模块的form表单如下: <form method="post" id="dform" action="?" target= ...
- MySQL迁移升级解决方案
任务背景 由于现有业务架构已不能满足当前业务需求,在保证数据完整的前提下,现需要将原有数据库迁移到另外一台单独的服务器上,在保证原有服务正常的情况下,将原有LAMP环境中mysql数据库版本5.6.3 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph(有源上下界最大流 模板)
关于有源上下界最大流: https://blog.csdn.net/regina8023/article/details/45815023 #include<cstdio> #includ ...
- The 2018 ACM-ICPC Chinese Collegiate Programming Contest Fight Against Monsters
#include <iostream> #include <cstdio> #include <cstring> #include <string> # ...
- Java观察者模式(Observer)
一.定义 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己.主要应用在java的AWT事件机制 ...
- 通过Proxool配置访问数据库的要点
proxool 配置的时候有Proxool.properties 或者 Proxool.xml 两种方式初始化. 我的配置环境是 myEclipse10+tomcat6.0 + mysql5.0 . ...
- Report Server multiple value 多值选择
一.项目需求 今天在做项目的时候,有一个需求,具体如下:在Report Server中存在一个报表,报表中有一个参数doctor_name,该参数允许多值,默认全部.但是由于前端页面医生选择时多选没有 ...