Android Dex分包原理
为什么要分包?
1、65536问题
导致因素
随着项目apk的庞大以及加入更多的第三方库,app的方法数已经超过了65536,会导致程序根本跑不起来。
原因
在生成.dex文件后由于有很多冗余的资源,所以Android中会对dex文件进行优化,Davlik模式下利用dexopt
工具进行优化,而dexopt有两个问题:Dexopt
会把每一个类的方法 id 检索起来,存在一个链表结构里面,但是这个链表的长度是用一个short 类型
来保存的,导致了方法 id 的数目不能够超过65536个, 当一个项目足够大的时候,显然这个方法数的上限是不够的;- Dexopt 使用
LinearAlloc
来存储应用的方法信息, Dalvik LinearAlloc 是一个固定大小的缓冲区。在Android 版本的历史上,LinearAlloc 分别经历了4M/5M/8M/16M限制。Android 2.2和2.3的缓冲区只有5MB,Android 4.x提高到了8MB 或16MB。当方法数量过多导致超出缓冲区大小时,也会造成dexopt崩溃;
- 在
ART模式
下 ,采用的是dexoat
工具,对应生成art虚拟执行可执行的.oat
文件,这个是包含多个dex文件;
- 在
2、怎么解决这个问题
- 在gradle中添加MultiDex支持,加载classes2.dex
multiDexEnabled true
- 执行MultiDex.install()
@Override protected void attachBaseContext (Context base) {
super.attachBaseContext(base);
MultiDex.ins