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>節點,添加:

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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章