1. 程式人生 > >Android進階之使用multidex(產生多個dex)解決Dex超出方法數65535的限制

Android進階之使用multidex(產生多個dex)解決Dex超出方法數65535的限制

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' }
}

4 參考連結