美文网首页
Android Dex分包

Android Dex分包

作者: 竖起大拇指 | 来源:发表于2021-03-03 14:27 被阅读0次

    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中。

    相关文章

      网友评论

          本文标题:Android Dex分包

          本文链接:https://www.haomeiwen.com/subject/jlmqqltx.html