天天看點

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的方法:

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

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

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

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

三種方法:

  1. Application 繼承MultiDexApplication
    Android使用multidex解決方法數越界問題65536
  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問題呐!

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

繼續閱讀