美文网首页
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分包

    最近项目apk方法数即将达到65536上限,虽然通过瘦身减少了一些方法数,但是随着更多sdk的接入,终究还是避免不...

  • android dex分包

    最简单的dex demo from http://blog.csdn.net/u013478336/article...

  • android dex 分包

    1、添加依赖 在module下的build.gradle文件 ,defaultConfig 节点中添加multiD...

  • Android Dex分包

    1.为什么要分包? 65536问题 导致因素随着项目apk的庞大以及加入更多的第三方库,app的方法数已经超过了6...

  • Android Dex分包—Gradle方式

    上篇文章讲到了ant方式进行dex分包《Android Dex分包》,本篇文章再来看一下采用gradle方式进行d...

  • Android Dex分包原理

    为什么要分包? 1、65536问题 导致因素随着项目apk的庞大以及加入更多的第三方库,app的方法数已经超过了6...

  • Android Dex 分包指南

    一、背景 随着业务规模发展,不断的加入新的功能,添加新的类库,app的方法数已经超过65535,这样的情况下就会遇...

  • Android dex分包方案

    当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机...

  • Android dex分包方案

    当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机...

  • Android Dex分包之旅

    当程序越来越大之后,出现了一个 dex 包装不下的情况,通过 MultiDex 的方法解决了这个问题,但是在底端机...

网友评论

      本文标题:Android Dex分包

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