若是你是一個android開發者,你至少據說過的Dalvik的蛋疼的64K方法限制。歸納地說,在一個DEX文件,你能夠調用不少的方法,但你只能調用它們最前面的65,536個 ,由於這是在方法調用集合中的全部的空間了。若是你的源代碼和狂拽炫酷叼炸天的三方庫中方法超過了這個限制。看這篇文章就對了。 html
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) java
點此查看更多相關話題 android
爲了解決這個問題,Android開發社區有人想出了一些解決方案,好比dmarcato的這個,還有casidiablo的這個。他們都是可行的,可是須要一些比較嚴格的條件。 app
最終,Google決定提供一套官方的解決方案,在10月14日的時候發佈了MultiDex 支持庫,隨後幾周gradle在 v0.14.0版本中也支持了。 ide
若是你在使用 Android Studio,這個用起來很簡單。若是不是,強烈建議你遷移過來。由於Google很快就會不知處Eclipse插件和舊的基於Ant的系統構建方式。 測試
第1步
添加依賴於你的build.gradle支持MultiDex庫 gradle
dependencies { ... compile 'com.android.support:multidex:' ... } ui
第2步
在buildType或productFlavor中開啓multiDexEnabled。 this
defaultConfig { ... multiDexEnabled true ... } spa
如今,根據你的項目狀況,你有3種選擇:
若是你沒有建立本身的Application 類,在你的清單文件AndroidManifest.xml中配置android.support.multidex.MultiDexApplication就能夠了。
.... android:name="android.support.multidex.MultiDexApplication" ...
若是你的Application繼承了其餘的類,而且你不想改變或者沒辦法改變。按照下面的方法重寫attachBaseContext()
public class MyApplication extends FooApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } }
不論你選擇上面哪一種,都會建立多個大小差很少的dex文件代替單個龐大的dex文件。運行的時候回同事加載全部的這些dex文件。
當年編譯app的時候,Gradle會生成不少個dex文件和一個apk文件讓你能夠在設備或者模擬器上運行。
你能夠從這個項目看到上面的效果
Out of memory 問題
對於有不少依賴的項目,編譯可能由於下面的錯誤中斷
Error:Execution failed for task ':app:dexDebug'. ... Error Code: 3 Output: UNEXPECTED TOP-LEVEL ERROR: java.lang.OutOfMemoryError: GC overhead limit exceeded at com.android.dx.cf.cst.ConstantPoolParser.parse0(ConstantPoolParser.java:326) ...
在build.gralde android標籤下面添加下面代碼能夠解決
dexOptions { incremental true javaMaxHeapSize "4g" }
應用啓動緩慢
根據咱們的經驗,添加了這個支持庫之後,大多數狀況下都正常了。這對某些設備,好比Kindle Fire上面,應用啓動會比以前慢不少。加載全部的類在應用一啓動的時候會花費大量的時間。這就會致使黑屏一段時間,甚至致使ANR.
更多推薦方案點擊這裏
這個雖然在大多數時候能夠解決DEX 64K的問題,可是應該是保留使用。當你嘗試使用它之前,請先嚐試刪除不須要的依賴而且使用ProGuard混淆,若是你必需要使用這個方案。請確保在舊設備上作了測試。