0
点赞
收藏
分享

微信扫一扫

Android Dex分包

未定义变量 2021-09-30 阅读 137
Android

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,并存放在BaseDexClassLoaderDexPathList中。

举报

相关推荐

0 条评论