本文主要是介绍Android The number of method references in a .dex file cannot exceed 64K.,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
编译项目时报错:The number of method references in a .dex file cannot exceed 64K.
查阅得知:在Android系统中,一个App的所有代码都在一个Dex文件里面。Dex是一个类似Jar的存储了多有Java编译字节码的归档文件。因为Android系统使用Dalvik虚拟机,所以需要把使用Java Compiler编译之后的class文件转换成Dalvik能够执行的class文件。这里需要强调的是,Dex和Jar一样是一个归档文件,里面仍然是Java代码对应的字节码文件。当Android系统启动一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt。DexOpt的执行过程是在第一次加载Dex文件的时候执行的。这个过程会生成一个ODEX文件,即Optimised Dex。执行ODex的效率会比直接执行Dex文件的效率要高很多。 但是在早期的Android系统中,DexOpt的LinearAlloc存在着限制: Android 2.2和2.3的缓冲区只有5MB,Android 4.x提高到了8MB或16MB。当方法数量过多导致超出缓冲区大小时,会造成dexopt崩溃,导致无法安装。
另外由于DEX文件格式限制,一个DEX文件中method个数采用使用原生类型short来索引文件中的方法,也就是4个字节共计最多表达65536个method,field/class的个数也均有此限制。对于DEX文件,则是将工程所需全部class文件合并且压缩到一个DEX文件期间,也就是Android打包的DEX过程中, 单个DEX文件可被引用的方法总数被限制为65536(自己开发以及所引用的Android Framework和第三方类库的代码)。
解决方法:
1.导入依赖
// Dex 分包,解决 64k 方法问题implementation 'androidx.multidex:multidex:2.0.1'
2.app的build.gradle中配置:
defaultConfig {// 无痛修改包名:https://www.jianshu.com/p/17327e191d2e// 开启 Dex 分包multiDexEnabled true}
3.你的application中添加方法:
@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);// 使用 Dex分包MultiDex.install(this);}
然后同步即可。
涉及案例:
引导界面滑动导航 + 大于等于1页时无限轮播 + 各种切换动画轮播效果(一个项目中实用的Banner无限轮播图效果)
https://github.com/bingoogolapple/BGABanner-Android
这篇关于Android The number of method references in a .dex file cannot exceed 64K.的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!