如果你的Android項目足夠大,又或者你引用了許多第三庫,那麼一定會遇到DexIndexOverflowException,在Gradle建構時報錯:
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexIndexOverflowException: Cannot merge new index 65562 into a non-jumbo instruction!
或者是:
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
這就是著名的DEX 64K問題,據說是Dalvik當初設計單個DEX最多可以存放65536方法的ID,是以如果方法數過多就會出現這個問題。上述異常的兩種情況要分開處理。
第一種non-jumbo instruction
如果報
Cannot merge new index 65562 into a non-jumbo instruction!
這個問題則很容易解決,直接修改build.gradle,清理項目後重新sync編譯:
android {
dexOptions {
jumboMode = true
}
}
第二種 method ID not in [0, 0xffff]: 65536
如果報
method ID not in [0, 0xffff]: 65536
這個問題則稍微麻煩一些。谷歌提供了解決方案,把單個巨大的Dex分成多個:
修改build.gradle,添加編譯multidex包
dependencies {
compile 'com.android.support:multidex:'
}
開啟multiDexEnabled:
android {
defaultConfig {
multiDexEnabled true
}
}
修改Application類,這個情況要分成3種:
1.沒有建立自定義Application類(使用預設的Application類):
直接配置清單檔案AndroidManifest.xml中的
<application>
節點,添加:
2.自定義的Application類繼承預設的
android.app.Application
:
這種情況把繼承類改成
android.support.multidex.MultiDexApplication
即可
3.自定義的Application類繼承别的類,而你無法修改或者不想改:
則要重寫
attachBaseContext
方法:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
修改後編譯遇到OOM問題
按上面修改編譯後出現:
UNEXPECTED TOP-LEVEL ERROR:
java.lang.OutOfMemoryError: GC overhead limit exceeded
修改build.gradle
android {
dexOptions {
incremental true
javaMaxHeapSize "4g"
}
}
Sync後再次編譯即可。
聲明
原創文章,歡迎轉載,請保留出處。
有任何錯誤、疑問或者建議,歡迎指出。
我的郵箱:[email protected]