1 概述
1.1 为什么要拆包
随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sdk或者公共支持的jar包,项目耦合性高,重复作用的类越来越多),出现了一个 dex 包装不下的情况,出现65536问题。
1.2 为什么方法数不能超过65535
在Dalvik指令集里,调用方法的invoke-kind指令中,method reference index只给了16bits,最多能调用65535个方法,所以在生成dex文件的过程中,当方法数超过65535就会报错。细看指令集,除了method,field和class的index也是16bits,所以也存在65535的问题。
1.3 MultiDex实现原理
Apk在运行的时候,有一个dexpathlist,而Multidex的源码中,会根据你的系统版本号对dexpathlist做修改,将所有的dex都添加到dexpathlist中。
1.4 dex拆分步骤分为:
(1)自动扫描整个工程代码得到main-dex-list;
(2)根据main-dex-list对整个工程编译后的所有class进行拆分,将主、从dex的class文件分开;
(3)用dx工具对主、从dex的class文件分别打包成 .dex文件,并放在apk的合适目录。
2 具体集成
2.1 将如下配置加入工程 build.gradle中
2.2 配置
否则:
3 其他包冲突问题
3.1 问题描述
Gradle build error, Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'
3.2 解决
This is what worked for me, added it into build.gradle:
android {
packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
}
}