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的更新要有所了解,对新功能要选择性的使用。