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.Android系统对分包的影响
-
Android 5.0以下:
运行在Davlik虚拟机上,优化使用dexopt工具并分包,每次运行先加载主包,然后反射子包,存在主包子包的先后问题; -
Android 5.0以上:
运行在ART虚拟机上,优化使用dexoat工具,生成多个包含dex文件的.oat文件,.oat文件是混合了主包子包,已经在APK安装时生成,故程序运行起来不存在主包子包的加载先后问题;
3.MultiDex的基本原理
通过DexFile
来加载Secondary DEX
,并存放在BaseDexClassLoader
的DexPathList
中。
网友评论