Android進階之使用multidex(產生多個dex)解決Dex超出方法數65535的限制
阿新 • • 發佈:2019-02-02
1 概述
1.1 為什麼要拆包
隨著應用不斷迭代,業務線的擴充套件,應用越來越大(比如集成了各種第三方sdk或者公共支援的jar包,專案耦合性高,重複作用的類越來越多),出現了一個 dex 包裝不下的情況,出現65536問題。
1.2 為什麼方法數不能超過65535
在Dalvik指令集裡,呼叫方法的invoke-kind指令中,method reference index只給了16bits,最多能呼叫65535個方法,所以在生成dex檔案的過程中,當方法數超過65535就會報錯。細看指令集,除了method,field和class的index也是16bits,所以也存在65535的問題。
1.3 MultiDex實現原理
Apk在執行的時候,有一個dexpathlist,而Multidex的原始碼中,會根據你的系統版本號對dexpathlist做修改,將所有的dex都新增到dexpathlist中。
1.4 dex拆分步驟分為:
(1)自動掃描整個工程程式碼得到main-dex-list;
(2)根據main-dex-list對整個工程編譯後的所有class進行拆分,將主、從dex的class檔案分開;
(3)用dx工具對主、從dex的class檔案分別打包成 .dex檔案,並放在apk的合適目錄。
2 具體整合
2.1 將如下配置加入工程 build.gradle中
2.2 配置
否則:
3 其他包衝突問題
3.1 問題描述
Gradle build error, Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'
3.2 解決
This is what worked for me, added it into build.gradle:
android {
packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
}
}