快过年了,项目进度放换了,看android 热修复方案的时候,顺便把多dex拆分方案,看了一下。
1.前提执行备案
方案需要大家了解只是:
1.ant编译android项目
step 2: 跟android项目添加ant编译方式。参考 android update proejct -p ./
step 3: 然后在项目的根目录中运行:ant debug 或者ant releces
2.android 编译apk过程
大概流程:
step 1. 收集所有的java文件,包括:R.java(通过android aapt生成),.java文件,.aidl文件(通过android AIDL 工具生成)
step 2.将生成的java文件,调用javac编译为.class文件
step 3.执行代码混淆
step 4.将所有的.class文件,通过android dex工具,打包为一个.dex文件()。
step 5. 将res,asset,dex,打包为apk
step 6. 签名
以上是android apk编译的大概流程。
2. 拆分dex原理:
3.实现方案
整体方案参考 上面连接描述的。这个方案并没有自己重写android apk编译流程的build.xml文件。只是将android 原来的(%ANDROID_HOME%/tools/ant/build.xml,复制到项目中,将原来的文件做了些小的添加,
整体方案如下:
1.在android 编译流程中 step 3代码混淆执行完成后,将需要拆分的class文件移动别的文件夹中
2. 在android 编译流程中 step 4中,当主dex文件执行完成后,在将需要拆分的class文件执行一次dex
3.在android编译流程中 step 5之前,将拆分出来的dex文件复制到asset/dex(路径可以随意指定)目录中
4.编译结束后,将复制到asset/dex文件中的dex文件删除
5. 在apk的Application的oncreate中通过,反射,将asset/dex文件夹中的所有dex文件,加载到ClassLoader中,见:MultiDex.java
下面进入主题:
step 1: 配置项目可以使用ant编译,参考上面ant使用
在生成的build.xml中添加:
<!-- 拆分dex,从build_apk.xml移动到这里 -->
<property name="out.dir" value="bin" />
<property name="out.absolute.dir" location="${out.dir}" />
<property name="asset.dir" value="assets" />
<property name="asset.absolute.dir" location="${asset.dir}" />

step 2 :将(%ANDROID_HOME%/tools/ant/build.xml 复制到项目的跟目录下,名称可以随意命名
A.我将android默认的build文件修改为:build_apk.xml
B. 修改ant默认的build.xml最后一句:<import file="${sdk.dir}/tools/ant/build.xml" />为:
<
import
file
="build_apk.xml"
/>
C.定义代码混淆后执行的target,代码位置在<target name="-obfuscate">前面加入:
<!-- add by shehonghao ,拆分dex文件,开始-->
<!-- 代码混淆后执行 -->
<target name="-post-obfuscate"/>
<!-- add by shehonghao ,拆分dex文件,结束-->
D.在target:<target name="-obfuscate">的最后面加入:
<!-- add by shehonghao,拆分dex文件,开始-->
<!-- 代码混淆结束后,开始拆封class文件 -->
<antcall target="-post-obfuscate"></antcall>
<!-- add by shehonghao,拆分dex文件,结束-->