BoostMultiDex

低版本安卓快速加载 MultiDex
授权协议 Apache 2.0
开发语言 Java C/C++
所属分类 手机/移动开发、 手机开发工具
软件类型 开源软件
地区 国产
投 递 者 师增
操作系统 Android
开源组织
适用人群 未知
 软件概览

BoostMultiDex 是一个用于 Android 低版本设备(4.X及以下,SDK < 21)快速加载多 DEX 的解决方案,由字节跳动的抖音/Tiktok  Android 技术团队出品。

相比于 Android 官方原始 MultiDex 方案,它能够减少 80% 以上的黑屏等待时间,挽救低版本 Android 用户的升级安装体验。并且,不同于目前业界所有优化方案,BoostMultiDex 方案是从 Android Dalvik 虚拟机底层机制入手,从根本上解决了安装 APK 后首次执行 MultiDex 耗时过长问题。

背景

Android低版本(4.X及以下,SDK < 21)的设备,采用的 Java 运行环境是 Dalvik 虚拟机。它相比于高版本,最大的问题就是在安装或者升级更新之后,首次冷启动的耗时漫长。这常常需要花费几十秒甚至几分钟,用户不得不面对一片黑屏,熬过这段时间才能正常使用 APP。

这是非常影响用户的使用体验的。尤其在海外,像东南亚以及拉美等地区,还存有着很大量的低端机。4.X 以下低版本用户虽然比较少,但对于抖音及 Tiktok 这样有着亿级规模的用户的APP,即使占比10%,数目也有上千万。因此如果想要打通下沉市场,这部分用户的使用和升级体验是绝对无法忽视的。

这个问题的根本原因就在于,安装或者升级后首次 MultiDex 花费的时间过于漫长。为了解决这个问题,字节跳动挖掘了 Dalvik 虚拟机的底层系统机制,对 DEX 相关处理逻辑进行了重新设计,最终推出了BoostMultiDex方案,挽救低版本Android用户的升级安装体验。

技术要点

BoostMultiDex方案的技术实现要点如下:

  1. 利用系统隐藏函数,直接加载原始DEX字节码,避免ODEX耗时
  2. 多级加载,在DEX字节码、DEX文件、ODEX文件中选取最合适的产物启动APP
  3. 单独进程做OPT,并实现合理的中断及恢复机制

更重要的是,BoostMultiDex 已经在抖音/TikTok 亿级全球用户上验证通过,可以说涵盖了各个国家、各种复杂情况的Android机型,目前业界其他大型 AP P都很难涉及到如此广泛的规模。由此,字节跳动也解决了各种奇怪的兼容性问题,最大程度上确保了技术方案的稳定性。

快速接入

build.gradle的dependencies中添加依赖:

dependencies {
... ...
    // For specific version number, please refer to app demo
    implementation 'com.bytedance.boost_multidex:boost_multidex:${ARTIFACT_VERSION}'
}

与官方MultiDex类似,在Application.attachBaseContext的最前面进行初始化即可:

public class YourApplication extends Application {

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        
        BoostMultiDex.install(base);
        
... ...
    }

编译构建

如果想自行编译打包,需要使用R16B版本的NDK以支持armeabi架构,如果不需要,可以直接在boost_multidex/build.gradle 中去掉此依赖。

执行以下命令即可构建本地aar包:

./gradlew :boost_multidex:assembleRelease

产物为boost_multidex/build/outputs/aar/boost_multidex-release.aar

性能对比

Android版本 厂商 机型 原始MultiDex耗时(s) BoostMultiDex耗时(s)
4.4.2 LG LGMS323 33.545 5.014
4.4.4 MOTO G 45.691 6.719
4.3 Samsung GT-N7100 24.186 3.660
4.3.0 Samsung SGH-T999 30.331 3.791
4.2.2 HUAWEI Hol-T00 崩溃 3.724
4.2.1 HUAWEI G610-U00 36.465 4.981
4.1.2 Samsung I9100 30.962 5.345

以上是在抖音上测得的实际数据,APK 中共有 6 个 Secondary DEX,显而易见,BoostMultiDex 方案相比官方MultiDex 方案,其耗时有着本质上的优化,基本都只到原先的11%~17%之间。 也就是说BoostMultiDex减少了原先过程80%以上的耗时。 另外其中有一个机型,在官方 MultiDex 是直接崩溃无法启动的。使用 BoostMultiDex 也将使得这些机型可以焕发新生。

 相关资料
  • 本文向大家介绍iscroll安卓低版本卡顿,如何解决?相关面试题,主要包含被问及iscroll安卓低版本卡顿,如何解决?时的应答技巧和注意事项,需要的朋友参考一下 方案一:iScroll v5.1.3 设置momentum: true 方案二:配置probeType 方案三:开启硬价加速:给scroll元素增加css样式:一webkit一transform:translate3d(0,0,0);

  • BAMS是一个完全开源的政企信息管理系统基础框架。它是轻量级的,简单易学的(学习成本真的很低,没有extjs,没有easyUI,没有繁琐的js UI库。只要java基础扎实,再稍懂一点js即可,真的是为java开发人员量身定制的一套框架啊),框架以Spring Framework为核心、Jsp+Dwr作为模型视图控制器、Hibernate作为数据库操作层。 BAMS已内置 一系列企业信息管理系统的

  • B2B版本集成 B2B的用户,初始化方法,打开聊窗方法和登录方法的逻辑如下 : 在每次点击打开聊窗的时候,都要调用初始化方法初始化SDK,登录方法登录与注销和打开聊窗打开聊窗的方法,调用顺序不能变。

  • 我们有一个Sonatype Nexus在我们的环境中运行,它配置了另一个Nexus作为代理存储库。当我们消耗我们的依赖时,我们向我们的关系索取它们。直到昨天我在我们的项目中添加了一个新的依赖项。 Maven似乎没有正确解析部署的快照版本。在maven日志中,我可以看到它正在下载maven-metadata.xml,但是当它试图下载包含二进制文件的zip文件时,它没有用当前的快照版本替换-snaps

  • 当我通过VS代码运行我的网页时,我的所有图片都会显示出来,但由于某种原因,当我通过localhost运行网页时,没有任何图片或CSS被发送。这是我下面的代码,任何帮助都将不胜感激。我曾试图在网上找到解决方案,但迄今为止似乎没有任何效果。 这是我的文件结构

  • 问题内容: 我正在尝试把我的头围住Swift语言。使用Objective-C在代码中构建视图时,常见的模式是覆盖UI属性并像这样延迟加载它们: 这允许将UIElement的配置包含在其设置中,但是不会导致每次都对其进行重新配置。 看来我们无权访问Swift中的后备存储,并且关键字实际上没有相同的语义。 我很好奇是否有人在Swift中找到了类似的模式,该模式允许人们以一种简洁的语法方式将变量和常量的