Android Dex文件編譯過程

  1. Java源碼編譯:通過javac將源碼編譯爲.class文件
  2. 多DEX分包:腳本將類根據一定規則劃分到住dex和從dex中,生成配置文件
  3. proguard優化混淆:對.class文件進行壓縮、優化、混淆處理
  4. 轉換爲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分包流程

  1. 生成manifest_keep.txt
    解析出AndroidManifest.xml中所有的組件類:包括Activity、Service、Receiver以及ContentProvider,這些類將和Application入口類一起放在manifest_keep.txt文件中。
  2. 生成maindexlist.txt文件
    查找mainfest_keep.txt中所有類的直接引用類,將其放保存在maindexlist.txt
  3. 生成多個dex
    dx工具接收參數,將maindexlist.txt文件包含的所有class編譯進主dex,並生成其他dex。

MutiDex加載原理

BaseDexClassLoader(findClass)
|
DexPathList (遍歷dexElements)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章