美文网首页
app编译打包时的65536问题

app编译打包时的65536问题

作者: android_zyq | 来源:发表于2018-03-19 20:14 被阅读10次

两种情况,第一种:

第一种non-jumbo instruction

UNEXPECTED TOP-LEVEL EXCEPTION: 

com.android.dex.DexIndexOverflowException:Cannot merge new index 65562 into a 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:1.0.1'

}

开启multiDexEnabled:

android {    

        defaultConfig {        

                multiDexEnabled true

           }

}

修改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方法:

@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 {       

         incrementaltruejavaMaxHeapSize"4g"

        }

}

Sync后再次编译即可。

分包后有两种情况,一种是你代码方法数没有超过65536,那么还是在一个dex里,和没分包一样

如果方法数量比较多,那么就会超出方法数,执行分包

分包的实现就这些配置,就这些,当然可能遇到分包的maindex不包含应用初始的类,想要配置maindex,请参考:

http://www.jianshu.com/p/9eb063fa9c79

想理解分包的原因加深理解的话可以看看这篇:

相关文章

网友评论

      本文标题:app编译打包时的65536问题

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