instant run 导致 ClassNotFoundException ,意外吧?

来源:互联网 发布:微信电影网站源码 编辑:程序博客网 时间:2024/05/21 06:34


Bug场景:

adb调试时 ,apk正常安装运行无问题。这个问题困扰了我1天。

然而我将apk移动到手机,手动安装运行时就会爆出ClassNotFoundException,异常日志如下:

Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.wyb.arcgislocation1029.MapActivity" on path: DexPathList[[zip file "/data/app/com.example.wyb.arcgislocation1029-1/base.apk"],nativeLibraryDirectories=[/data/app/com.example.wyb.arcgislocation1029-1/lib/arm, /data/app/com.example.wyb.arcgislocation1029-1/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]


查到的原因和解决办法:

我查边所有资料,有很多说法:

1、 manifest中name路径书写不对的,但是这会在studio自动检查语法时就会报红,排除。

2、引用相同包,但版本不同。我没有引用包。

3、so包引用时,两个第三方库的 so包冲突:

成因第一部分:当项目里有arm-v7目录时,系统会严格遵循最优适配原则,当遇到arm-v7的cpu时,只去arm-v7目录查找so库。

成因第二部分:merge原则,当打包时,studio会把各个module进行合并,例如manifest文件。它也会合并arm-v7目录,可以想象——如果第三方依赖A和B,A指定了arm-v7里的so包,B没有指定arm-v7里的so包,那么合并的结果时最终的apk里的arm-v7目录里只有A的so包。

于是在遇到arm-v7的cup时,B就悲催的找不到自己的so包了——找不到类。


真实原因和解决办法:

但是我的问题都不是这些导致的。真正的原因很无奈,是studio的 Instant Run 功能导致的。

这个功能在我之前使用的studio版本里并没有,所以它里面具体做了什么,我并不清楚 ,我只是怀疑它坏了我的事。所以把它关了。

关闭流程:file——setting——build、execution、deployment——Instant Run

然后我的apk就可以正常手动安装运行了。


结语:

对工具和api的更新要有所了解,对新功能要选择性的使用。