1. 程式人生 > >Android Studio升級遇到的問題記錄

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的外掛插本也可以相應的升級.

參考: