Android使用multidex解決方法數越界問題65536

概述:

QQ羣:372135639

在Android中單個dex文件能包含的最大方法數爲 65536 。 這個方法數目來自,Android FrameWork,一依賴包,已經代碼中包含的方法,還有些項目使用的第三方庫裏面的方法 的總和。

乍一看這個數字很大,一般不會超過。但是隨着App的更新速度火箭般提高,和用戶的各種需求大量增加,最終在產品的指揮下,項目越來越大。現如今,只要是比較大型的項目,都會遇到 65536 問題。

問題描述:

1.當dex方法數超過65536,我們會遇到這種情況:

無法正常編譯,異常提示如下:

Error:Execution failed for task ':duchazhushou:dexRelease'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    C:\Users\jeff\AppData\Local\Android\sdk\android-sdk\build-tools\21.1.1\dx.bat --dex --output D:\dev\android\Duchazhushou_TDT\duchazhushou\build\intermediates\dex\release --input-list=D:\dev\android\Duchazhushou_TDT\duchazhushou\build\intermediates\tmp\dex\release\inputList.txt
Error Code:
    2
Output:
    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
        at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:502)
        at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:277)
        at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:491)
        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:168)
        at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
        at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:302)
        at com.android.dx.command.dexer.Main.run(Main.java:245)
        at com.android.dx.command.dexer.Main.main(Main.java:214)
        at com.android.dx.command.Main.main(Main.java:106)

2.還有一種情況,並非是方法數超出65536,會出現在低版本手機安裝Apk時,異常停止。(這種情況,我們放在以後再說,今天主要解決AS multidex問題)

如今的博客論壇上,解決65536問題,大多是把dex拆分多個,即:分包。其實對於現在的項目來說,這種高強度的代碼改動,非常繁瑣麻煩。我不推薦。

Eclipse處理65536相當麻煩,必須在項目中加入gradle,然後用google的muldex進行分包。

所以我們今天只討論AS解決65536的方法:

1. 首先要使用包含 Android SDK Build Tools 21.1 或者以上版本的編譯環境。

2. 在 app --> build.gradle --> defaultConfig --> 添加multiDexEnabled  true

3. dependencies --> 添加multidex依賴 ( complie 'com.android.support:multidex:1.0.0')

配置方面完成後,我們需要在代碼上添加multidex支持:

三種方法:

  1. Application 繼承MultiDexApplication
    代碼如下

  2. 在manifest中指定Application爲MultiDexApplication

<Application
    android:name="android.support.multidex.MultiDexApplication"
    android:allowBackup="ture"
    android:theme=“@Style/AppTheme"
    android:label="@Style/app_name"
    android:icon="@mipmap/ic_launcher"
>
</Application>

3.在 繼承Application的主方法類 重寫 attachBaseContext方法 【注意:此方法要比 onCreter 提前】

public class MainApplication extends Application{

    @Override
    protexted void attachBaseContext(Context base){
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

完成以上操作,就可以避免65536問題吶!

—– 溫故而知新可以爲師矣。

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