如果你的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>
節點,添加:
android:name="android.support.multidex.MultiDexApplication"
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]