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 | public class MyApplication extends Application{ |
这样会生成classes.dex classes2.dex classes3.dex …多个dex文件
为啥会有65536的限制
一个 dex 文件的方法引用数不能大于 64k,64k 的准确值是(64 * 1024 = 65536)。
invoke-kind (调用各类方法)指令中,方法引用索引数是 16 位的,也就是最多调用 2^16 = 65536 个方法,这就是 DexFormat 中 MAX_MEMBER_IDX 为 0xFFFF 的原因。