由于最近将Android Studio-2.2升级至2.3了,一直用测试机编译应用,未发现任何异常,可是今天突然发现一个小意外,也是真令人头疼。
今天直接用我自己的手机Run,Studio一直提示安装失败,提示错误:
- Installation failed with message Failed to establish session.
- It is possible that this issue is resolved by uninstalling an existing version of the apk if it is present, and then re-installing.
- WARNING: Uninstalling will remove the application data!
- Do you want to uninstall the existing application?
- *原文翻译:
安装失败,消息未能建立会话。
这是可能的,这个问题解决通过卸载APK现有的版本,如果真的存在,然后重新安装。
警告:卸载会删除应用程序数据!
是否要卸载现有应用程序?
点击确定后会卸载与此应用同包名应用,然后就没有然后了,这时我也很费解,不过想想我的手机是小米5,Android版本7.0,由于MIUI ROM定制原因,我第一时间想到的是MIUI的Bug或者Android7.0的Bug,所以也就没想那么多,直接将apk发送到手机,再次安装,安装成功,正有点小激动呢,结果应用一点开一个更让人费解的事情诞生了:
EXCEPTION: main
Process: com.app.chao.chaoapp, PID: 18274
java.lang.RuntimeException: Unable to instantiate application com.app.chao.chaoapp.App: java.lang.ClassNotFoundException: Didn’t find class “com.app.chao.chaoapp.App” on path: DexPathList[[zip file “/data/app/com.app.chao.chaoapp-1/base.apk”],nativeLibraryDirectories=[/data/app/com.app.chao.chaoapp-1/lib/arm64, /data/app/com.app.chao.chaoapp-1/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]
这个异常很明显是说,系统试图从nativeLibraryDirectories中加载指定的so文件,但没找到。我原先的想法,如果arm64-v8a中找不到,系统应该到armeabi中去找,毕竟armeabi是个缺省的so目录。但实际结果貌似不会去armeabi中查到。
于是开始各种百度ClassNotFoundException,得到的答案大多是,需要的jar没有引入,或者v4包冲突,这时我也很无奈,只得百度nativeLibraryDirectories=[/data/app/lib/arm64,这时看到很多国外论坛,其中一个国外大大谈到:
建议直接打开(解压缩的形式)生成的apk文件,查看是否有”不合理”的目录存在。在我的情况中的确看到了arm64-v8a目录。目录中有一个其他第三方的so文件,最后问题由于依赖项目有个arm64-v8a目录,所以如果要移除某个类目,一定要删干净。
但是奇怪的是,删除arm64-v8a目录之后,运行也出错。按照简单理解,arm64-v8a目录已经没有了,应该不会在从arm64目录中找so才是。除非,系统根据手机abi指定目录加载,然而实际不是。
于是copy备份项目后,删除so相关的代码和引用,运行依然报错,至此国外大大也帮不了我。
这时我已经在崩溃边缘了,后来总觉得哪里不对,吃了个午饭回来后,直接手动新建一个新的项目,直接运行hello world项目依然报错,这时我基本已经锁定原因了,因为既然这样都不能运行,那么问题很大几率出现在开发工具上,所以直接对比当前版本和旧版本的Android Studio,发现一个神奇的功能,于是就这样问题迎刃而解了,所以,有的坑总是要去填的,如果我们都不抱着想要解决的决心和耐心,那么这个坑也许就永远落脚下了。