速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

开源 | BoostMultiDex:挽救 Android Dalvik 机型 APP 升级安装体验

  • 2020-06-01
  • 本文字数:2421 字

    阅读完需:约 8 分钟

开源 | BoostMultiDex:挽救 Android Dalvik 机型APP升级安装体验

现代 Android APP 的代码量通常都比较大,很容易就会带上多个 DEX 文件。Android 低版本的设备采用的 Java 运行环境是 Dalvik 虚拟机,如果含有多个 DEX 想要在这些设备上正常运行,就需要使用官方的 MultiDex 方案。MultiDex 需要对 APK 内的原始 DEX 文件做 ODEX 优化,所以执行时间过于漫长,这就会使得安装或者升级后首次 MultiDex 花费的时间很久。


抖音自研的 BoostMultiDex 方案,可以大幅改善原有的 MultiDex 耗时。并且,不同于目前业界所有优化方案,我们是从 Android Dalvik 虚拟机底层机制入手,从根本上解决了安装后首次执行 MultiDex 耗时过长问题。


之前已经发布过两篇文章,详细介绍了 BoostMultiDex 的实现原理:


抖音 BoostMultiDex 优化实践:Android 低版本上 APP 首次启动时间减少 80%(一)


抖音 BoostMultiDex 优化实践:Android 低版本上 APP 首次启动时间减少 80%(二)


其中也展示了这一优化带来的显著效果:


开源地址


Github 项目地址:


https://github.com/bytedance/BoostMultiDex

实际表现

我们之前的文章里面只是提到了技术分析和一些优化数据,为了让大家更加直观地感受 BoostMultiDex 带来的明显效果,这里就来看下我们项目中实际表现是怎样的,以今日头条 APP 为例,左边是 BoostMultiDex,右边是原始 MultiDex:


https://mp.weixin.qq.com/mp/readtemplate?t=pages/video_player_tmpl&auto=0&vid=wxv_1355562813275815937


可以明显看到页面打开时间的差距,左边的 BoostMultiDex 方案有非常显著的优化,界面在短暂等待后就立即展示出来了,而右边的原始 MultiDex 方案要等待半分钟左右才能展示界面。


当然,这个优化带来的实际体验提升情况,还要看结合每个 APP 自身。除了加载多 DEX 的时间,APP 启动阶段还有大量自身业务逻辑,而这块的耗时是相对固定的。这属于业务层面的启动优化问题了,应当尽量减少启动阶段执行那些不会立即使用的模块加载。 而 BoostMultiDex 的接入成本极低,能保证仅替换一行代码,就达到立竿见影的效果。

快速接入

本方案的使用和官方 MultiDex 基本上是一致的,只需两步即可接入。


首先,在 build.gradle 的 dependencies 中添加依赖:


dependencies {... ...    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);
... ... }
复制代码


这样就完成了所有工作了。立马编译运行,看看是不是 APP 首次冷启动变得健步如飞?

一些补充

之前的两篇文章中已经对 BoostMultiDex 方案的技术实现细节有详细叙述,主要涵盖了以下几个


技术要点:


  1. 利用系统隐藏函数,直接加载原始 DEX 字节码,避免 ODEX 耗时

  2. 多级加载,在 DEX 字节码、DEX 文件、ODEX 文件中选取最合适的产物启动 APP

  3. 单独进程做 OPT,并实现合理的中断及恢复机制


此外,这里再补充一些说明。

主 DEX 相关

首先,和 MultiDex 一样,BoostMultiDex 的所有类都是需要打入主 DEX 里面的,默认情况下,由于 Application 内有直接引用 BoostMuliDex,Gradle 就会自己帮我们自动打入主 DEX。但如果由于某些罕见的异常情况没有打入,我们就需要自己额外做这个处理,强制把com.bytedance.boost_multidex包中的所有类打入到主 DEX 里。

对于 ODEX 优化进程的处理

ODEX 优化进程是在名为:boost_multidex的进程中的,他会开启一个OptimizeService后台服务做优化,当然,所有进程都会走到Application里,Application里包含了很多其他进程共有逻辑,对于 ODEX 优化进程而言,这些逻辑是不需要的,因此,我们提供了一个BoostMultiDex.isOptimizeProcess方法,便于使用者自行判断,直接跳过这些无关业务逻辑。由于整个 BoostMultiDex 都在主 DEX 中,因此对于 ODEX 优化进程,BoostMultiDex.install也是不需要的。当然不做这个判断也关系不大,只是会额外执行一些无用代码,有些许效率损失。

Android 4.4 的 ART 机型

Android 4.4 机型同时集成了 Dalvik 和 ART 两套虚拟机,一般厂商的默认出厂机型都是采用 Dalvik 的。由于本方案只针对 Android Dalvik 机型有优化,对 ART 是没有效果的,因此,如果遇到某个机型优化效果差异不大,可以先看下是什么机型,并从输出日志可以看出是什么原因没有走到优化逻辑。

部分 Dalvik 内部数据结构有偏移的机型

我们的方案中涉及到对 Dalvik 虚拟机内部DvmDex结构体做设置,而如果厂商对这些结构做了特殊修改,就会导致设置到错误的偏移。这种情况目前看来还是极少的,仅在我们在线上大面积灰度过程中发现了一些 HTC 机型有修改这个结构,对此我们已经做了修正。这里也提前说明,避免大家在看到这块代码的时候遇到困惑。

最后

当然,技术上说的再多,不如看实际收益。目前,BoostMultiDex 已经在抖音亿级全球用户上验证通过,可以说涵盖了各种复杂情况的 Android 机型,目前业界其他大型 APP 都很难涉及到如此广泛的规模。由此,我们也解决了各种奇怪的兼容性问题,最大程度上确保了技术方案的稳定性。


对于项目的开源代码,我们保证, 和抖音自身使用的代码完全一致 ,直接开箱即用,避免大家接入后还要自己踩一遍我们曾经遇到的坑。如果在实际使用过程中如果遇到什么问题,我们也希望大家及时提出,一起贡献代码,共同将 BoostMultiDex 打造得更加稳健高效。


目前, 抖音 Android 基础技术团队仍在上海、北京、杭州、深圳大力招人 ,如果你也同样对技术充满热情,同样追求极致优化,想要与我们共同建设亿级用户全球化 APP,那就欢迎进入字节跳动招聘官网查询抖音 Android 相关职位,也可以联系 xiaolin.gan@bytedance.com 咨询相关信息或者直接发送简历内推!


本文转载自公众号字节跳动技术团队(ID:toutiaotechblog)。


原文链接


https://mp.weixin.qq.com/s/0gtkc7IQdhKjFxrHCuNZwQ


2020-06-01 10:061543

评论

发布
暂无评论
发现更多内容

淘宝商品详情API返回值中的预售与定制信息

技术冰糖葫芦

api 网关 API Gateway API 文档 API 测试 pinduoduo API

mcgs笔记 设备窗口 快速连接变量

万里无云万里天

自动化 HMI mcgs

mcgs笔记 设备窗口 通讯状态

万里无云万里天

自动化 HMI mcgs

Linux:IP转INT详解

百度搜索:蓝易云

阿里巴巴拍立淘API:实时图像搜索与快速响应的技术探索

代码忍者

API 测试 pinduoduo API

WebServer解析HTTP响应报文

百度搜索:蓝易云

mcgs笔记 画面 由全屏回到缩小的窗口状态

万里无云万里天

自动化 HMI mcgs

全面方位了解桌面管理

Geek_a83400

TDengine 签约寓信科技,推动智慧公寓的数字化转型

TDengine

数据库 tdengine

SpringCache和Redis结合基本使用

百度搜索:蓝易云

Datadog 监控最佳实践 | 收集正确的数据

巴辉特

监控 可观测性 监控系统 运维监控 开源监控

每日必抢小程序下单总结

阿里技术

小程序 支付宝 购物 夸克

DeepinV20/Ubuntu安装postgresql方法

百度搜索:蓝易云

Linux进程相关命令

百度搜索:蓝易云

以 Buycbuy为蓝本:淘宝微店代购集运系统搭建秘籍

tbapi

淘宝代购系统 淘宝代购集运系统 华人代购系统 逆向海淘系统 代购商城系统

Flink Forward Asia 2024 议题征集令|探索实时计算新边界

阿里云大数据AI技术

flink 实时计算 FFA

京东广告投放平台整洁架构演进之路

京东零售技术

架构 代码

PingCAP 荣登 2024 Cloud 100 China 第七名

PingCAP

一文让你明白手游行业需要堡垒机的必要性

行云管家

网络安全 数据安全 堡垒机 手游

升华产品管理以提高业务敏捷性

ShineScrum

VMware Avi Load Balancer 30.2.2 发布下载,新增功能概览

sysin

负载均衡 vmware 应用交付 AVI

AI话中秋,移动高清超高清技术描绘家庭娱乐“新画卷”

最新动态

低代码平台搭建CRM系统实现公海客户自动分配

低代码小观

低代码开发 低代码平台 低代码搭建crm系统

咸宁等保测评机构在哪里?电话多少?

行云管家

等保 等级保护 等保测评 咸宁

构建智能电商新生态:深度解析京东商品详情API的力量

代码忍者

API 测试 pinduoduo API

中国智能汽车腾飞,为什么异构算力是第一生产力?

脑极体

异构计算

【YashanDB知识库】DBeaver无法访问数据库

YashanDB

yashandb 崖山数据库

【YashanDB知识库】YAS-02025 no free space in virtual memory pool

YashanDB

yashandb 崖山数据库 yashandb知识库

多项政策扶持与流量激励,华为音乐空间音频创作者获全链路支持

最新动态

实时分析都靠它→揭秘YashanDB列式存储引擎的技术实现

YashanDB

列式存储 yashandb 崖山数据库

TiDB 扩容过程中 PD 生成调度的原理及常见问题丨TiDB 扩缩容指南(一)

PingCAP

开源 | BoostMultiDex:挽救 Android Dalvik 机型APP升级安装体验_开源_字节跳动技术团队_InfoQ精选文章