欢迎在我的公众号aserbao给我留言,无偿服务!同时,欢迎大家来加入交流讨论群,一起讨论Android开发技术!群二维码定时在我公众号更新!
来来来,各位看官,看一看,瞧一瞧,随便评论点个赞!走过路过千万不要错过,之前没遇到今后一定会遇到,之前遇到了加深一下印象也不错。
大家好,我是小朱,听哥一句劝,在开发的时候能自己写的尽量别用别人的,能用小的包替代的,咱们就不用大包替代。这不,一不小心方法数就超过65535了。,如何解决这个问题,且听我慢慢道来。
首先你开发一段时间过后,你可能会遇到如下异常,没遇到你今后也会遇到的:
Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536
trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.
可能还会有其他异常,不一一列举,但凡出现65535这个数字,八九不离十都是同一个原因造成的,那就是恭喜你:你的方法总数超过65535了!俗称“64K引用限制”
在Android 5.0之前的版本Dalvik可执行文件必须使用分包支持。也就是导入multidex包,后面会详细讲解。
注意 :如果您的项目配置时所面向的 Dalvik 可执行文件分包使用的是 minSdkVersion 20 或更低版本,并且您将其部署到运行 Android 4.4(API 级别 20)或更低版本的目标设备上,则 Android Studio 会停用 Instant Run。
在Android5.0及之后的版本,因为使用ART运行,原生支持从 APK 文件加载多个 DEX 文件。ART 在应用安装时执行预编译,扫描 classesN.dex 文件,并将它们编译成单个 .oat 文件,供 Android 设备执行。因此,如果您的 minSdkVersion 为 21 或更高值,则不需要 Dalvik 可执行文件分包支持库。
当minSdkVersion 为 21 或更高值时,使用Instant Run时,Android Studio 还是会自动将应用配置给Dalvik虚拟机,由于 Instant Run 仅适用于调试版本的应用,您仍需配置发布构建进行 Dalvik 可执行文件分包,以规避 64K 限制。
说来说去还是得,无论你minSdkVersion的版本多少,只要你超过方法数超过64K,你就得分包,否则你调试不了。区别在于,如果你不分包,一个可以打包运行,一个不行。
怎么优化?两点很重要:
既然无法避免,该来的总要来,那么兄弟,这个异常就要对不住了,我要开始解决你了 。
android {
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 28
multiDexEnabled true
}
...
}
如果您的minSdkVersion 设置为21及更高,那么现在就结束了。如果您的 minSdkVersion 设置为 20 或更低值,那么不好意思,你还要多走几步,往下看。
如果您的 minSdkVersion 设置为 20 或更低值,那么需要引入multidex包。操作如下:
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 28
multiDexEnabled true
}
...
}
dependencies {
implementation 'com.android.support:multidex:1.0.3'
}
配置有两种方式:
第一种:继承MultiDexApplication
public class AserbaoApplication extends MultiDexApplication {
……
}
第二种,在Application的attachBaseContext()方法中声明:
public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
官方链接之-配置方法数超过 64K 的应用