64k导致的百度地图NoClassDefFoundError

近期,一个项目中的百度地图出了点小问题,编译通过了,但在4.x系统上运行会报NoClassDefFoundError,在5.x和6.x系统上就没有问题。

第一感觉这个问题应该和低版本系统有关。
但是百度地图相关的代码并没有改动,之前在4.x上明明可以正常运行的。
还是有点奇怪的~

网上关于这个错误都是导入jar包的问题,我应该不是这种情况。

想到最近新加的依赖和新做的大量工作,突然感觉可能是64k导致的问题,我之前有设置过multiDexEnabled true,也许dex文件不止一个了,而这个项目中64k问题还没处理过,导致低版本上出现NoClassDefFoundError

于是分析了之前这个项目的apk和现在打包的apk,发现果然比之前多了一个dex文件。

而官网中有这么两段话:
Versions of the platform prior to Android 5.0 (API level 21) use the Dalvik runtime for executing app code. By default, Dalvik limits apps to a single classes.dex bytecode file per APK.

Android 5.0 (API level 21) and higher uses a runtime called ART which natively supports loading multiple DEX files from APK files.

重点我已经加黑标出,也就是说,5.0以下的系统默认只加载一个dex文件,可以推测出:百度地图报错的相关类在另一个没被加载的dex文件中。而5.0以后的系统支持加载多个dex文件,所以不会出现这个错误。

于是按照官网,对5.0以下系统的兼容需要添加依赖

dependencies {
  compile 'com.android.support:multidex:1.0.1'
}

之后使用MultiDexApplication,这不是重点,不细说了。(具体的64k处理方法可以参考官网)

这样处理了64k问题,发现确实不报这个错误了!哈哈哈

但又出现了一个新错误:

 Resources$NotFoundException: File res/drawable/abc_vector_test.xml from drawable resource ID #0x7f020052

这个还好,提升构建工具的版本就解决了:

buildToolsVersion '24.0.1'

所以,随着一个项目的逐渐庞大,64k问题还是要尽早做好处理。

参考:https://developer.android.com/studio/build/multidex.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值