概述:
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支援:
三種方法:
- Application 繼承MultiDexApplication
- 在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問題呐!
—– 溫故而知新可以為師矣。