【AS-AndroidX】遷移AndroidX帶來的問題

-----------------------------------------------------------------------------------------------------

遷移主原文https://blog.csdn.net/dandelionela/article/details/102976961      # 【AS-AndroidX】AndroidX的遷移 #

-----------------------------------------------------------------------------------------------------

問題1:使用自動遷移時報錯

那麼就需要去每一個報錯的類裏面,參照類對照表,逐一把未替換的support類及自動替換錯的類修正成AndroidX的類

需要注意的是,IDE的build日誌只輸出100個錯誤,雖然寫的是100個,其實後邊還有很多。改完這100還有下一個100,加油!

 

問題2:百度地圖SDK

報錯:java.lang.UnsatisfiedLinkError: No implementation found for int com.baidu.mapsdkplatform.comjni.tools.JNITools.initClass

2019-11-12 11:55:59.209 23040-23040/? E/libc: Access denied finding property "ro.vendor.df.effect.conflict"
2019-11-12 11:55:59.223 23040-23040/? E/NativeLoader: found libBaiduMapSDK_base_v5_4_4.so error
2019-11-12 11:55:59.223 23040-23040/? E/.***.****: No implementation found for int com.baidu.mapsdkplatform.comjni.tools.JNITools.initClass(java.lang.Object, int) (tried Java_com_baidu_mapsdkplatform_comjni_tools_JNITools_initClass and Java_com_baidu_mapsdkplatform_comjni_tools_JNITools_initClass__Ljava_lang_Object_2I)
2019-11-12 11:55:59.224 23040-23040/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.*****.***.******, PID: 23040
    java.lang.UnsatisfiedLinkError: No implementation found for int com.baidu.mapsdkplatform.comjni.tools.JNITools.initClass(java.lang.Object, int) (tried Java_com_baidu_mapsdkplatform_comjni_tools_JNITools_initClass and Java_com_baidu_mapsdkplatform_comjni_tools_JNITools_initClass__Ljava_lang_Object_2I)
        at com.baidu.mapsdkplatform.comjni.tools.JNITools.initClass(Native Method)
        at com.baidu.mapsdkplatform.comjni.tools.a.b(Unknown Source:6)
        at com.baidu.mapsdkplatform.comapi.a.<clinit>(Unknown Source:23)
        at com.baidu.mapsdkplatform.comapi.a.a(Unknown Source:0)
        at com.baidu.mapsdkplatform.comapi.c.a(Unknown Source:17)
        at com.baidu.mapapi.SDKInitializer.initialize(Unknown Source:2)
        at com.dandelionela.metro.elametro.MetroApplication.initializeBaiduMap(MyApplication.java:61)
        at com.dandelionela.metro.elametro.MetroApplication.onCreate(MyApplication.java:53)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1183)
...

第一步嘗試去百度地圖官方API文檔找些資料,沒有找到,所以就先升級了一下百度地圖到V6.0.0仍然報錯。

於是將jniLibs文件夾下的ndk支持庫從單獨的【armeabi-v7a】改爲單獨的【arm64-v8a】發現報錯消失。

很奇怪,在升級AndroidX之前同一手機使用armeabi-v7a可以正常使用,升級完AndroidX之後,就不行了。也是奇怪。

 

問題3:

2019-11-12 13:43:19.118 27256-27256/com.***.*** E/libc: Access denied finding property "ro.vendor.df.effect.conflict"
2019-11-12 13:43:19.136 27256-27295/com.***.*** E/Perf: Fail to get file list lib
2019-11-12 13:43:19.136 27256-27295/com.***.*** E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
2019-11-12 13:43:19.137 27256-27295/com.***.*** E/Perf: Fail to get file list ***.***.***.***
2019-11-12 13:43:19.137 27256-27295/com.***.*** E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
2019-11-12 13:43:19.216 27256-27256/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.***.***, PID: 27256
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.***.***/com.***.***.activity.WelcomeActivity}: android.view.InflateException: Binary XML file line #2 in com.***.***:layout/activity_welcome: Binary XML file line #2 in com.***.***/activity_welcome: Error inflating class androidx.constraintlayout.ConstraintLayout
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3304)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3443)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2040)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7520)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
     Caused by: android.view.InflateException: Binary XML file line #2 in com.***.***:layout/activity_welcome: Binary XML file line #2 in com.***.***:layout/activity_welcome: Error inflating class androidx.constraintlayout.ConstraintLayout
     Caused by: android.view.InflateException: Binary XML file line #2 in com.***.***:layout/activity_welcome: Error inflating class androidx.constraintlayout.ConstraintLayout
     Caused by: java.lang.ClassNotFoundException: androidx.constraintlayout.ConstraintLayout
        at java.lang.Class.classForName(Native Method)
        at java.lang.Class.forName(Class.java:454)
        at android.view.LayoutInflater.createView(LayoutInflater.java:819)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1010)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:965)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:663)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:538)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:481)
        at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:555)
        at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:161)
        at com.***.***.activity.WelcomeActivity.onCreate(WelcomeActivity.java:31)
        at android.app.Activity.performCreate(Activity.java:7894)
        at android.app.Activity.performCreate(Activity.java:7881)

突然找到了問題的關鍵所在:

androidx.constraintlayout.ConstraintLayout

這個類路徑有誤!這是由IDE自動轉化爲AndroidX的時候自動生成的。顯然是錯誤的。我們只改了Java文件中的導包錯誤,卻忽略了XML文件中的類的錯誤。

打開看一下源碼:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        ... />

</androidx.constraintlayout.ConstraintLayout>

果然是ConstraintLayout標籤的包名不對。按照對照表,把錯誤的【androidx.constraintlayout.ConstraintLayout】修改爲【androidx.constraintlayout.widget.ConstraintLayout】

然後全局檢索一下錯誤的AndroidX替換,改爲正確的AndroidX替換。幾十處,擦。。。。。

同樣的問題還發生在其他IDE導包錯誤的地方:

Caused by: java.lang.ClassNotFoundException: android.support.design.widget.TabLayout
Caused by: java.lang.ClassNotFoundException: androidx.core.view.ViewPager
Caused by: java.lang.ClassNotFoundException: android.support.v7.widget.RecyclerView
Caused by: java.lang.ClassNotFoundException: android.support.design.widget.FloatingActionButton
Caused by: java.lang.ClassNotFoundException: android.support.v4.widget.SwipeRefreshLayout
Caused by: java.lang.ClassNotFoundException: androidx.core.widget.SwipeRefreshLayout
Caused by: java.lang.ClassNotFoundException: androidx.core.widget.DrawerLayout
Caused by: java.lang.ClassNotFoundException: android.support.design.widget.CoordinatorLayout
Caused by: java.lang.ClassNotFoundException: android.support.design.widget.AppBarLayout
Caused by: java.lang.ClassNotFoundException: android.support.design.widget.NavigationView
Caused by: java.lang.ClassNotFoundException: android.support.constraint.Guideline

XML佈局文件中需要修改的常用控件:

Support Library Class AndroidX Class
android.support.constraint.ConstraintLayout androidx.constraintlayout.widget.ConstraintLayout
android.support.design.widget.FloatingActionButton com.google.android.material.floatingactionbutton.FloatingActionButton
android.support.design.widget.AppBarLayout com.google.android.material.appbar.AppBarLayout
android.support.v7.widget.RecyclerView androidx.recyclerview.widget.RecyclerView
android.support.design.widget.CoordinatorLayout androidx.coordinatorlayout.widget.CoordinatorLayout
android.support.v7.widget.Toolbar androidx.appcompat.widget.Toolbar
android.support.v4.widget.SwipeRefreshLayout androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android.support.design.widget.TabLayout com.google.android.material.tabs.TabLayout
android.support.v4.view.ViewPager androidx.viewpager.widget.ViewPager
android.support.v4.widget.DrawerLayout androidx.drawerlayout.widget.DrawerLayout
android.support.design.widget.NavigationView com.google.android.material.navigation.NavigationView
android.support.v7.widget.SwitchCompat androidx.appcompat.widget.SwitchCompat
android.support.design.widget.CollapsingToolbarLayout com.google.android.material.appbar.CollapsingToolbarLayout
android.support.v7.widget.CardView androidx.cardview.widget.CardView

容易被Android Studio 識別錯誤的控件:

Wrong AndroidX Class by IDE Correct AndroidX Class
androidx.constraintlayout.ConstraintLayout androidx.constraintlayout.widget.ConstraintLayout
androidx.core.widget.SwipeRefreshLayout androidx.swiperefreshlayout.widget.SwipeRefreshLayout
androidx.core.view.ViewPager androidx.viewpager.widget.ViewPager
androidx.core.widget.DrawerLayout androidx.drawerlayout.widget.DrawerLayout

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章