- Java源碼編譯:通過javac將源碼編譯爲.class文件
- 多DEX分包:腳本將類根據一定規則劃分到住dex和從dex中,生成配置文件
- proguard優化混淆:對.class文件進行壓縮、優化、混淆處理
- 轉換爲dex文件:dx\d8將.class文件轉換爲dex文件
Android dex編譯流程
DEX格式結構圖
詳情瞭解:一篇文章帶你搞懂DEX文件的結構
MutiDex方案背景
64k應用限制: Conversion to Dalvik format failed: Unable to execute dex:method ID not in[0,0xffff]:65536
原因:
1、DexOpt優化的限制
早期Android系統中DexOpt會把每一個類的方法id檢索起來,存在一個鏈表裏面。鏈表的長度是用short類型來保存,導致來方法id的數目不能超過65536個。
2、dalvik bytecode的限制
Dalvik的invoke-kind指令集,設置16bit表示方法引用數,最大值爲65536,invoke-kind{vC,vD,vE,vF,vG},meth@BBBB
MutiDex方案引入
Android 5.0以前:使用Dalvik可執行文件分包支持庫
Android 5.0以後:Android 5.0及更高版本使用ART運行時,後者原生支持從APK文件加載多個DEX文件。ART在應用安裝時執行預編譯,掃描classesN.dex文件,並將他們編譯成單個.oat文件,供Android設備執行。因此,如果minSdkVersion爲21或更高值,則不需要Dalvik可執行文件分包支持庫。
綜上所述:要不把minSdkVersion爲21或更高值,要不就添加分包支持庫
修改build.gradle
minSdkVersion爲21
android {
defaultConfig {
......
minSdkVersion 21
targetSdkVersion 26
multiDexEnabled true
versionCode 1
versionName "1.0"
......
}
}
添加分包支持庫
android {
defaultConfig {
......
minSdkVersion 15
targetSdkVersion 26
multiDexEnabled true
versionCode 1
versionName "1.0"
......
}
dependencies {
......
compile'com.android.support:multidex:1.0.3'
}
}
修改Application代碼(兩種方式)
1、Application繼承MultiDexApplication
2、調用MultiDex.install(this)啓用分包
MutiDex分包流程
- 生成manifest_keep.txt
解析出AndroidManifest.xml中所有的組件類:包括Activity、Service、Receiver以及ContentProvider,這些類將和Application入口類一起放在manifest_keep.txt文件中。 - 生成maindexlist.txt文件
查找mainfest_keep.txt中所有類的直接引用類,將其放保存在maindexlist.txt - 生成多個dex
dx工具接收參數,將maindexlist.txt文件包含的所有class編譯進主dex,並生成其他dex。
MutiDex加載原理
BaseDexClassLoader(findClass)
|
DexPathList (遍歷dexElements)