{"id":20464625,"url":"https://github.com/bytedance/boostmultidex","last_synced_at":"2025-04-12T15:40:41.427Z","repository":{"id":40343569,"uuid":"266704485","full_name":"bytedance/BoostMultiDex","owner":"bytedance","description":"BoostMultiDex is a solution for quickly loading multiple dex files on low Android version devices (4.X and below, SDK \u003c21).","archived":false,"fork":false,"pushed_at":"2022-05-12T07:07:30.000Z","size":274,"stargazers_count":1185,"open_issues_count":7,"forks_count":123,"subscribers_count":21,"default_branch":"master","last_synced_at":"2025-04-03T16:11:59.915Z","etag":null,"topics":["android"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bytedance.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-05-25T06:45:42.000Z","updated_at":"2025-03-26T11:05:49.000Z","dependencies_parsed_at":"2022-07-12T12:14:15.255Z","dependency_job_id":null,"html_url":"https://github.com/bytedance/BoostMultiDex","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bytedance%2FBoostMultiDex","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bytedance%2FBoostMultiDex/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bytedance%2FBoostMultiDex/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bytedance%2FBoostMultiDex/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bytedance","download_url":"https://codeload.github.com/bytedance/BoostMultiDex/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248590774,"owners_count":21129888,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android"],"created_at":"2024-11-15T13:15:49.798Z","updated_at":"2025-04-12T15:40:41.407Z","avatar_url":"https://github.com/bytedance.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"![](docs/bmd-logo.png)\n\n[![GitHub license](https://img.shields.io/badge/license-Apache%202-blue)](https://github.com/bytedance/ByteX/blob/master/LICENSE)\n\n\n**BoostMultiDex**是一个用于Android低版本设备（4.X及以下，SDK \u003c 21）快速加载多DEX的解决方案，由抖音/Tiktok Android技术团队出品。\n\n相比于Android官方原始MultiDex方案，它能够减少80%以上的黑屏等待时间，挽救低版本Android用户的升级安装体验。并且，不同于目前业界所有优化方案，BoostMultiDex方案是从Android Dalvik虚拟机底层机制入手，从根本上解决了安装APK后首次执行MultiDex耗时过长问题。\n\n## 背景\n\n我们知道，Android低版本（4.X及以下，SDK \u003c 21）的设备，采用的Java运行环境是Dalvik虚拟机。它相比于高版本，最大的问题就是在安装或者升级更新之后，首次冷启动的耗时漫长。这常常需要花费几十秒甚至几分钟，用户不得不面对一片黑屏，熬过这段时间才能正常使用APP。\n\n这是非常影响用户的使用体验的。尤其在海外，像东南亚以及拉美等地区，还存有着很大量的低端机。4.X以下低版本用户虽然比较少，但对于抖音及Tiktok这样有着亿级规模的用户的APP，即使占比10%，数目也有上千万。因此如果想要打通下沉市场，这部分用户的使用和升级体验是绝对无法忽视的。\n\n这个问题的根本原因就在于，安装或者升级后首次MultiDex花费的时间过于漫长。为了解决这个问题，我们挖掘了Dalvik虚拟机的底层系统机制，对DEX相关处理逻辑进行了重新设计，最终推出了BoostMultiDex方案，挽救低版本Android用户的升级安装体验。\n\n## 技术要点\n\nBoostMultiDex方案的技术实现要点如下：\n\n1. 利用系统隐藏函数，直接加载原始DEX字节码，避免ODEX耗时\n2. 多级加载，在DEX字节码、DEX文件、ODEX文件中选取最合适的产物启动APP\n3. 单独进程做OPT，并实现合理的中断及恢复机制\n\n更重要的是，BoostMultiDex已经在抖音/TikTok亿级全球用户上验证通过，可以说涵盖了各个国家、各种复杂情况的Android机型，目前业界其他大型APP都很难涉及到如此广泛的规模。由此，我们也解决了各种奇怪的兼容性问题，最大程度上确保了技术方案的稳定性。\n\n## 快速接入\n\nbuild.gradle的dependencies中添加依赖：\n\n```gradle\ndependencies {\n... ...\n    // For specific version number, please refer to app demo\n    implementation 'com.bytedance.boost_multidex:boost_multidex:${ARTIFACT_VERSION}'\n}\n```\n\n与官方MultiDex类似，在Application.attachBaseContext的最前面进行初始化即可：\n\n```java\npublic class YourApplication extends Application {\n\n    @Override\n    protected void attachBaseContext(Context base) {\n        super.attachBaseContext(base);\n        \n        BoostMultiDex.install(base);\n        \n... ...\n    }\n```\n\n## 编译构建\n\n如果想自行编译打包，需要使用[R16B版本的NDK](https://developer.android.com/ndk/downloads/older_releases)以支持armeabi架构，如果不需要，可以直接在boost_multidex/build.gradle中去掉此依赖。\n\n执行以下命令即可构建本地aar包：\n\n```gralde\n./gradlew :boost_multidex:assembleRelease\n```\n\n产物为`boost_multidex/build/outputs/aar/boost_multidex-release.aar`\n\n## 性能对比\n\n| Android版本 | 厂商 | 机型 | 原始MultiDex耗时(s) | BoostMultiDex耗时(s) |\n| :------: | :------: | :------: | :------: | :------: |\n| 4.4.2 | LG | LGMS323 | 33.545 | 5.014 |\n| 4.4.4 | MOTO | G | 45.691 | 6.719 |\n| 4.3 | Samsung | GT-N7100 | 24.186 | 3.660 |\n| 4.3.0 | Samsung | SGH-T999 | 30.331 | 3.791 |\n| 4.2.2\t | HUAWEI | Hol-T00 | 崩溃 | 3.724 |\n| 4.2.1 | HUAWEI | G610-U00 | 36.465 | 4.981 |\n| 4.1.2\t | Samsung | I9100\t | 30.962 | 5.345 |\n\n以上是在抖音上测得的实际数据，APK中共有6个Secondary DEX，显而易见，BoostMultiDex方案相比官方MultiDex方案，其耗时有着本质上的优化，基本都只到原先的11%~17%之间。 **也就是说BoostMultiDex减少了原先过程80%以上的耗时。** 另外我们看到，其中有一个机型，在官方MultiDex下是直接崩溃，无法启动的。使用BoostMultiDex也将使得这些机型可以焕发新生。\n\n## 详细原理\n\n请参考本项目[Wiki](https://github.com/bytedance/BoostMultiDex/wiki/Technical-Article)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbytedance%2Fboostmultidex","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbytedance%2Fboostmultidex","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbytedance%2Fboostmultidex/lists"}