产生65535的原因和解决办法

Android关于65535的问题

熟悉Android开发的都知道,在生成Dex过程中,方法数超过65535就会报错,本文只简述一下如何解决,更重要的是为什么会这样。简单来说,在Dalvik指令集中,调用方法的invoke-kind指令中,method reference index只给了16bits,最多能调用65535个方法,所以在生成dex文件的过程中,当方法数超过65535就会报错。其实除了method,filed和class的index也是16bits,所以也会存在65535的问题,只不过method的数量一般是最多的,所以最常见的也是方法数溢出的问题。

导入multidex包,配置gradle文件

multiDexEnabled true

implementation 'com.android.support:multidex:1.0.2'

Application中初始化

  • 继承MultiDexApplication
  • 重写Application 的attachBaseContext方法,这个方法是在onCreate之前执行的
1
2
3
4
5
6
7
8
public class MyApplication extends Application{  

@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}

这样会生成classes.dex classes2.dex classes3.dex …多个dex文件

为啥会有65536的限制

一个 dex 文件的方法引用数不能大于 64k,64k 的准确值是(64 * 1024 = 65536)。

invoke-kind (调用各类方法)指令中,方法引用索引数是 16 位的,也就是最多调用 2^16 = 65536 个方法,这就是 DexFormatMAX_MEMBER_IDX 为 0xFFFF 的原因。

详细原因查看

文章目录
  1. 1. 导入multidex包,配置gradle文件
  2. 2. Application中初始化
  3. 3. 为啥会有65536的限制