天天看點

DexIndexOverflowException兩種情況的解決方法

如果你的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]
           

繼續閱讀