由于最近将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发送到手机,再次安装,安装成功,正有点小激动呢,结果应用一点开一个更让人费解的事情诞生了:
03-20 12:56:37.933 18274-18274/com.app.chao.chaoapp E/AndroidRuntime: FATAL 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]]
at android.app.LoadedApk.makeApplication(LoadedApk.java:806)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5393)
at android.app.ActivityThread.-wrap2(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1564)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:160)
at android.app.ActivityThread.main(ActivityThread.java:6143)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:874)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:764)
Caused by: 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]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at android.app.Instrumentation.newApplication(Instrumentation.java:993)
at android.app.LoadedApk.makeApplication(LoadedApk.java:800)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5393)
at android.app.ActivityThread.-wrap2(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1564)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:160)
at android.app.ActivityThread.main(ActivityThread.java:6143)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:874)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:764)
- 1
这个异常很明显是说,系统试图从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,发现一个神奇的功能,于是就这样问题迎刃而解了,所以,有的坑总是要去填的,如果我们都不抱着想要解决的决心和耐心,那么这个坑也许就永远落脚下了。