美文网首页
方法数限制

方法数限制

作者: SoldierWIN | 来源:发表于2017-04-01 21:53 被阅读22次

    如果你的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 {        multiDexEnabledtrue}}

    修改Application类,这个情况要分成3种:

    1.没有创建自定义Application类(使用默认的Application类):

    直接配置清单文件AndroidManifest.xml中的节点,添加:

    android:name="android.support.multidex.MultiDexApplication"

    2.自定义的Application类继承默认的android.app.Application:

    这种情况把继承类改成android.support.multidex.MultiDexApplication即可

    3.自定义的Application类继承别的类,而你无法修改或者不想改:

    则要重写attachBaseContext方法:

    @OverrideprotectedvoidattachBaseContext(Contextbase) {      super.attachBaseContext(base);      MultiDex.install(this);    }

    修改后编译遇到OOM问题

    按上面修改编译后出现:

    UNEXPECTED TOP-LEVEL ERROR:

    Java.lang.OutOfMemoryError:GC overhead limit exceeded

    修改build.gradle

    android {    dexOptions {        incrementaltruejavaMaxHeapSize"4g"}}

    Sync后再次编译即可。

    相关文章

      网友评论

          本文标题:方法数限制

          本文链接:https://www.haomeiwen.com/subject/ugjwottx.html