今天在把网络通信代码从Intellidea(Java)迁移到Android Studio(Kotlin)的过程中,编译时出现下列错误 : 这个错误提示的意思是:在单个dex文件中,方法调用数不能大于65536。这是安卓开发过程中常见的错误之一。 根据文件格式,安卓android系统的安装包大体上有三种:base.apk、base.odex和base.vdex,它们的区别如下:1、 base.apk:最基本的应用程序的安装包文件格式,包含了应用的所有资源和代码(DEX字节码文件),本质上APK格式是一个压缩包文件,用户安装时,系统从这个文件中提取和加载应用内容。 2、 base.odex:经优化过的DEX文件(Optimized DEX),其可以加快程序的启动和运行速度。 3、 base.vdex:Vdex(Verified DEX)文件,包括DEX文件的验证信息和部分预处理数据,提升应用启动效率。在Android 10及以后引入,可替代部分odex功能;能加快启动速度,可以和odex文件配合使用或者单独存在。 也就是说安卓的安装包格式是dex,在这个dex格式中,单个文件调用方法(method,就是C语言中的函数function)不能超过65536个,超过了编译工程出错,无法生成目标代码。那么为什么有这个65536的限制呢?这就得从安卓的基础原理上讲。 安卓事实上通过支持Java编码技术一瞬间获得了Java的各种生态资源支持,但是其并没有直接使用Jvm虚拟机,而是使用Dalvik虚拟机,这有很多好处,比如单从内存优化角度,Dalvik虚拟机就有优势,适合嵌入式设备。 Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为.dex(即“Dalvik Executable”)格式的Java应用程序的运行。.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。而DEX文件是Dalvik虚拟机执行的字节码文件格式,单个DEX文件的结构设计决定了其方法索引表的大小有限,具体是方法调用数不能超过65536个,深层原因是invoke-kind (调用各类方法)指令中,方法引用索引数是 16 位的,也就是最多调用 2^16 = 65536 个方法。故而,一旦你开发的程序中调用方法数量大于65536个,只能通过分割成多个DEX文件这种方法来解决,具体解决方法如下: 此外,除了上面的解决方法之外,也可以通过下列方式解决: 1、如果工程中未定义Application的类,则只需要在AndroidManifest.xml文件使用MultiDexApplication替换Application即可。
android:name="android.support.multidex.multiDexApplication"
2.如果工程中已定义Application ,则让它继承MultiDexApplication。
作者:
于禄律师,曾经的程序员、硬件工程师。
尤其特别擅长处理涉及计算机、信息、网络类案件(诉讼、非诉,民事、行政、刑事),可外语沟通。
#android #Java #安卓 #dalvik #编程