好牛!抖音開源又一力作
大家都喜歡玩抖音,知道抖音是一個非常好的技術團隊,除了做App,他們也開源了一些方案,比如今天的 BoostMultiDex 。
BoostMultiDex是一個用于 Android 低版本設備(4.X 及以下,SDK < 21)快速加載多 DEX 的解決方案。
背景
我們知道,Android低版本(4.X及以下,SDK < 21)的設備,采用的Java運行環境是Dalvik虛擬機。它相比于高版本,最大的問題就是在安裝或者升級更新之后,首次冷啟動的耗時漫長。
這是非常影響用戶的使用體驗的。尤其在海外,像東南亞以及拉美等地區,還存有著很大量的低端機。4.X以下低版本用戶雖然比較少,但對于抖音及Tiktok這樣有著億級規模的用戶的APP,即使占比10%,數目也有上千萬。因此如果想要打通下沉市場,這部分用戶的使用和升級體驗是絕對無法忽視的。
這個問題的根本原因就在于,安裝或者升級后首次MultiDex花費的時間過于漫長。為了解決這個問題,我們挖掘了Dalvik虛擬機的底層系統機制,對DEX相關處理邏輯進行了重新設計,最終推出了BoostMultiDex方案,挽救低版本Android用戶的升級安裝體驗。
技術要點
BoostMultiDex方案的技術實現要點如下:
-
利用系統隱藏函數,直接加載原始DEX字節碼,避免ODEX耗時
-
多級加載,在DEX字節碼、DEX文件、ODEX文件中選取最合適的產物啟動APP
-
單獨進程做OPT,并實現合理的中斷及恢復機制
更重要的是,BoostMultiDex已經在抖音/TikTok億級全球用戶上驗證通過,可以說涵蓋了各個國家、各種復雜情況的Android機型,目前業界其他大型APP都很難涉及到如此廣泛的規模。由此,我們也解決了各種奇怪的兼容性問題,最大程度上確保了技術方案的穩定性。
快速接入
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
性能對比
以上是在抖音上測得的實際數據,APK中共有6個Secondary DEX,顯而易見,BoostMultiDex方案相比官方MultiDex方案,其耗時有著本質上的優化,基本都只到原先的11%~17%之間。 也就是說BoostMultiDex減少了原先過程80%以上的耗時。 另外我們看到,其中有一個機型,在官方MultiDex下是直接崩潰,無法啟動的。使用BoostMultiDex也將使得這些機型可以煥發新生。
性能對比如下:
項目地址: https://github.com/bytedance/BoostMultiDex