Android Studio升级遇到的问题记录

来源:互联网 发布:汉诺塔递归算法图解 编辑:程序博客网 时间:2024/05/16 23:52

Ⅰ.前言

博客,似乎好久不见了,一段时间的迷茫和忙碌,所以学习中的笔记记录也都未整理。看着PC桌面满满的笔记,是该静下心来整理整理。不积跬步,无以成江河,所以笔记还是必须要整理的。前几天安装了Android Studio开发工具正式版3.0.,看了AS3.0的功能介绍也尝试了,工具方面确实比2.3版本完善了很多,但是在项目的维护中,AS版本3.0仍遇到几个问题,刚好记录下.


Ⅱ.AS3.0遇到的问题

1.libsupportjni.so包运行失败

在真机(Android6.0)上是可以正常生成apk并运行的,而在夜神(Android4.4)模拟器则运行失败,报如下异常信息

    dlopen("/data/app-lib/com.wyk.android-2/libsupportjni.so") failed: dlopen failed: cannot locate symbol "strtof" referenced by "libsupportjni.so"...    11-24 17:29:29.855 3513-3513/? E/AndroidRuntime: FATAL EXCEPTION: main    Process: com.wyk.android, PID: 3513    java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "strtof" referenced by "libsupportjni.so"...    at java.lang.Runtime.loadLibrary(Runtime.java:364)    at java.lang.System.loadLibrary(System.java:526)    at com.android.tools.profiler.support.ProfilerService.<clinit>(ProfilerService.java:41)    at com.wyk.android.base.MyApplication.<init>(MyApplication.java:31)    at java.lang.Class.newInstanceImpl(Native Method)    at java.lang.Class.newInstance(Class.java:1208)    at android.app.hInstrumentation.newApplication(Instrumentation.java:1007)    at android.app.Instrumentation.newApplication(Instrumentation.java:992)    at android.app.LoadedApk.makeApplication(LoadedApk.java:511)    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4345)    at android.app.ActivityThread.access$1500(ActivityThread.java:135)    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)    at android.os.Handler.dispatchMessage(Handler.java:102)    at android.os.Looper.loop(Looper.java:136)    at android.app.ActivityThread.main(ActivityThread.java:5045)    at java.lang.reflect.Method.invokeNative(Native Method)    at java.lang.reflect.Method.invoke(Method.java:515)    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)    at dalvik.system.NativeStart.main(Native Method)

简单分析:

  • 可以在异常信息中看到 “libsupportjni.so “这个关键字眼,而在android4.4 的手机运行就会报错,6.0则没有问题,那么到底是Android版本的问题还是模拟器的问题,而之前没升级AS是可以运行在模拟器上的,这个问题只能待定了;

  • 尝试了N多解决方法之后,找到了解决方法,即去掉 AS设置中的”Enable advanced profiling”选项,则可以在模拟器中正常运行。这是因为在5.0以上最好使用推荐的设置,Profiler工具可以帮助更好的分析内存、网络等情况,可以在AS的下方看到profier这个工具,而5.0以下则不支持。

解决:

单击AS菜单 run —-> Edit Configurations… 去掉 “Enable advanced profiling”的打勾选项

这里写图片描述


2.FileProvider类找不到,Apk运行则崩溃

解决了上面libsupportjni.so包导致运行失败的问题后,接着遇到下面这个问题

    FATAL EXCEPTION: main Process: com.wyk.android, PID: 3976    java.lang.RuntimeException: Unable to get provider android.support.v4.content.FileProvider:     java.lang.ClassNotFoundException: Didn't find class "android.support.v4.content.FileProvider" on path:     DexPathList[[zip file "/data/app/com.wyk.android-2.apk"],    nativeLibraryDirectories=[/data/app-lib/com.wyk.android-2, /system/lib]]    at android.app.ActivityThread.installProvider(ActivityThread.java:4821)    at android.app.ActivityThread.installContentProviders(ActivityThread.java:4413)    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4353)    at android.app.ActivityThread.access$1500(ActivityThread.java:135)    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)    at android.os.Handler.dispatchMessage(Handler.java:102)    at android.os.Looper.loop(Looper.java:136)    at android.app.ActivityThread.main(ActivityThread.java:5045)    at java.lang.reflect.Method.invokeNative(Native Method)    at java.lang.reflect.Method.invoke(Method.java:515)    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)    at dalvik.system.NativeStart.main(Native Method)    Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.content.FileProvider"     on path: DexPathList[[zip file "/data/app/com.wyk.android-2.apk"],    nativeLibraryDirectories=[/data/app-lib/com.wyk.android-2, /system/lib]]    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)    at java.lang.ClassLoader.loadClass(ClassLoader.java:497)    at java.lang.ClassLoader.loadClass(ClassLoader.java:457)    at android.app.ActivityThread.installProvider(ActivityThread.java:4806)    at android.app.ActivityThread.installContentProviders(ActivityThread.java:4413)     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4353)     at android.app.ActivityThread.access$1500(ActivityThread.java:135)     ...

简单分析:

FileProvider是Android7.0用于访问文件的ContentProvider的子类,主要用于解决Android7.0的文件访问的适配问题,在司的项目中已使用FileProvider做了文件访问的适配.那么怎么会在AS版本升级后,出现FileProvider找不到的异常?

其实这是由于项目方法数过多,已经超出65535,所以早期在项目中使用multidex分dex包,而没有正确配置引起的, ” MultiDex.install(this); ” 这个初始化方法一般是建议写在application继承类的attachBaseContext方法里,而项目中则是写在onCreate方法里的。AS3.0之前一直没有出现该问题,可能是3.0版本,工具的检查变得严格了

解决:

将 “MultiDex.install(this);” 这个初始化方法写在application继承类的attachBaseContext方法里,则解决

class MyApplication extends Application{        @Override    protected void attachBaseContext(Context base) {        super.attachBaseContext(base);        MultiDex.install(this);//解决65535    }}   

Ⅲ.总结

  • AS3.0, Gradle版本也要升级到4.1,不过这个在AS3.0安装包里已经备好;

  • 而由于项目中已经改为kotlin开发,在AS3.0中,Kotlin的插件插本也可以相应的升级.

参考:

  • http://blog.csdn.net/likuan0214/article/details/78539853

  • https://jingyan.baidu.com/article/00a07f3875e20482d128dc7e.html