DexIndexOverflowException

本文介绍了解决Android开发中常见的DEX64K问题的方法,包括启用jumboMode、使用multidex支持库以及如何配置Application类来适配多DEX文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果你的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后再次编译即可。
————————————————
原文链接:https://blog.youkuaiyun.com/maxwell_nc/article/details/51050700

[ 3% 989/30520] Building with Jack: out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/with-local/classes.dex FAILED: /bin/bash -c "(rm -f out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/with-local/classes.dex ) && (rm -f out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/classes.jack ) && (rm -rf out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/jack-rsc ) && (mkdir -p out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/with-local/ ) && (mkdir -p out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/ ) && (mkdir -p out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/jack-rsc ) && (rm -f out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/jack-rsc/java-source-list ) && (touch out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/jack-rsc/java-source-list ) && (echo -n 'libcore/dex/src/main/java/com/android/dex/Annotation.java libcore/dex/src/main/java/com/android/dex/ClassData.java libcore/dex/src/main/java/com/android/dex/ClassDef.java libcore/dex/src/main/java/com/android/dex/Code.java libcore/dex/src/main/java/com/android/dex/Dex.java libcore/dex/src/main/java/com/android/dex/DexException.java libcore/dex/src/main/java/com/android/dex/DexFormat.java libcore/dex/src/main/java/com/android/dex/DexIndexOverflowException.java libcore/dex/src/main/java/com/android/dex/EncodedValue.java libcore/dex/src/main/java/com/android/dex/EncodedValueCodec.java libcore/dex/src/main/java/com/android/dex/EncodedValueReader.java libcore/dex/src/main/java/com/android/dex/FieldId.java libcore/dex/src/main/java/com/android/dex/Leb128.java libcore/dex/src/main/java/com/android/dex/MethodId.java libcore/dex/src/main/java/com/android/dex/Mutf8.java libcore/dex/src/main/java/com/android/dex/ProtoId.java libcore/dex/src/main/java/com/android/dex/SizeOf.java libcore/dex/src/main/java/com/android/dex/TableOfConten
最新发布
07-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值