Android Studio升級遇到的問題記錄
Ⅰ.前言
部落格,似乎好久不見了,一段時間的迷茫和忙碌,所以學習中的筆記記錄也都未整理。看著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的外掛插本也可以相應的升級.
參考: