AndroidX遷移小記
為什么要遷移AndroidX宝惰?因?yàn)锳ndroid 現(xiàn)有的軟件包,如Android支持庫(kù),正在被重構(gòu)為Androidx。盡管在Google Maven上仍然提供支持庫(kù)版本27及更低版本杨拐,但所有新開(kāi)發(fā)將只包含在Androidx 1.0.0及更高版本中。AndroidX隨后將成為主流擂啥,越來(lái)越多的主流的第三庫(kù)和Google的原生庫(kù)將僅僅支持AndroidX版本上的迭代和更新。
1.如何遷移
1).環(huán)境準(zhǔn)備
:AndroidX的遷移要求在在AndroidStudio 3.2 或更高版本中執(zhí)行帆阳,要求的targetSdkVersion版本為28(android9.0)哺壶,classpath 'com.android.tools.build:gradle:3.2.0'要3.2.0或者更高。
2).修改gradle.properties
:修改項(xiàng)目根目錄gradle.properties文件蜒谤,添加配置
android.useAndroidX=true 表示啟用
androidxandroid.enableJetifier=true 表示將依賴包遷移到androidx 山宾。如果取值為false,表示不遷移依賴包到androidx,但在使用依賴包中的內(nèi)容時(shí)可能會(huì)出現(xiàn)問(wèn)題鳍徽,如果項(xiàng)目中沒(méi)有使用任何三方依賴资锰,可以設(shè)置為false。
3).啟動(dòng)一鍵遷移
:在AS中執(zhí)行Refactor->Migrate to AndroidX 遷移后執(zhí)行 Flie -> Invalidate Caches /Restart 一下阶祭,確保依賴中的緩存文件都已更新绷杜。
2.修改項(xiàng)目代碼
AS中雖然提供了一鍵遷移插件工具,但是替換效果并不好濒募。因此鞭盟,在使用一鍵遷移完成后,還需要手動(dòng)修改項(xiàng)目中出錯(cuò)的地方瑰剃。
/**
*這里是舊版本的support依賴庫(kù)
*/
"support-v4" : "com.android.support:support-v4:${dependVersion.support}",
"appcompat-v7" : "com.android.support:appcompat-v7:${dependVersion.support}",
"design" : "com.android.support:design:${dependVersion.support}",
"recyclerview" : "com.android.support:recyclerview-v7:${dependVersion.support}",
"cardview" : "com.android.support:cardview-v7:${dependVersion.support}",
"annotations" : "com.android.support:support-annotations:${dependVersion.support}",
"constraint-layout" : "com.android.support.constraint:constraint-layout:1.0.2",
/**
*AndroidX版本對(duì)應(yīng)的依賴庫(kù)
*/
"support-v4" : "androidx.legacy:legacy-support-v4:1.0.0",
"appcompat-v7" : "androidx.appcompat:appcompat:1.0.2",
"design" : "com.google.android.material:material:1.1.0-alpha09",
"recyclerview" : "androidx.recyclerview:recyclerview:1.0.0",
"cardview" : "androidx.cardview:cardview:1.0.0",
"annotations" : "androidx.annotation:annotation:1.0.0",
"constraint-layout" : "androidx.constraintlayout:constraintlayout:1.1.3",
Activity/Fragment等Java文件和XML布局文件改動(dòng)Activity/Fragment/XML(包括涉及到使用support包的工具類等)齿诉,原來(lái)引用support包中的類,在Migrate后并不能完全對(duì)應(yīng)晌姚,會(huì)有很多錯(cuò)誤粤剧,所以需要改成對(duì)應(yīng)的androidX中的類引用。如果挨個(gè)刪掉原有的引用后挥唠,再重新導(dǎo)入正確的引用包抵恋,工作量會(huì)非常繁重。因此猛遍,可以使用全局替換: Edit ->Find -> Replace in path 馋记。整理出來(lái)常見(jiàn)的對(duì)應(yīng)關(guān)系如下:
android.support.annotation.Nullable androidx.annotation.Nullable
android.support.annotation.NonNull androidx.annotation.NonNull;
androidx.appcompat.widget.GridLayoutManager androidx.recyclerview.widget.GridLayoutManager
androidx.appcompat.widget.RecyclerView androidx.recyclerview.widget.RecyclerView;
androidx.appcompat.widget.LinearLayoutManager androidx.recyclerview.widget.LinearLayoutManager
androidx.appcompat.widget.LinearSmoothScroller androidx.recyclerview.widget.LinearSmoothScroller
androidx.appcompat.widget.OrientationHelper androidx.recyclerview.widget.OrientationHelper
androidx.appcompat.widget.SnapHelper androidx.recyclerview.widget.SnapHelper
androidx.core.app.FragmentTransaction androidx.fragment.app.FragmentTransaction
androidx.core.app.Fragment; androidx.fragment.app.Fragment;
androidx.core.app.FragmentManager androidx.fragment.app.FragmentManager;
androidx.core.app.FragmentStatePagerAdapter androidx.fragment.app.FragmentStatePagerAdapter
androidx.core.view.ViewPager androidx.viewpager.widget.ViewPager
androidx.core.app.FragmentActivity androidx.fragment.app.FragmentActivity
android.support.annotation.ColorInt androidx.annotation.ColorInt
android.support.annotation.ColorRes androidx.annotation.ColorRes
android.support.annotation.FloatRange androidx.annotation.FloatRange
android.support.annotation.AttrRes androidx.annotation.AttrRes
android.support.design.widget.AppBarLayout com.google.android.material.appbar.AppBarLayout
android.support.design.widget.CoordinatorLayout androidx.coordinatorlayout.widget.CoordinatorLayout
布局XML文件里面号坡,也不會(huì)自動(dòng)替換,需要手動(dòng)替換
<androidx.constraintlayout.ConstraintLayout/> <androidx.constraintlayout.widget.ConstraintLayout/>
<android.support.design.widget.CollapsingToolbarLayout/> <com.google.android.material.appbar.CollapsingToolbarLayout/>
<android.support.v7.widget.Toolbar/> <androidx.appcompat.widget.Toolbar/>
<android.support.v4.view.ViewPager/> <androidx.viewpager.widget.ViewPager/>
<android.support.v7.widget.RecyclerView/> <androidx.recyclerview.widget.RecyclerView/>
混淆配置
修改前的混淆文件是針對(duì)support庫(kù)做的混淆配置梯醒,在完成遷移后宽堆,需要添加對(duì)AndroidX的混淆配置
-keep class com.google.android.material.** {*;}
-keep class androidx.** {*;}
-keep public class * extends androidx.**
-keep interface androidx.** {*;}
-dontwarn com.google.android.material.**
-dontnote com.google.android.material.**
-dontwarn androidx.**
查漏補(bǔ)缺
全局替換也可能有少數(shù)遺漏或者錯(cuò)誤的情況,可以再全局Find in Path 茸习,使用support關(guān)鍵字全局查找畜隶,再做替換
替換完成后,進(jìn)行Rebuild号胚,如果有錯(cuò)誤籽慢,編譯失敗。再進(jìn)行手動(dòng)修改猫胁,經(jīng)過(guò)幾次編譯嘗試后箱亿,最終達(dá)到編譯成功,
表示項(xiàng)目代碼修改完成弃秆。
其他問(wèn)題(第三方依賴庫(kù)有報(bào)錯(cuò))
- 1届惋、檢查第三方依賴包,如果第三方依賴包支持AndroidX的更新菠赚,那我們可以直接將第三部直接更新到最新版本即可脑豹。
- 2、如果第三方不支持AndroidX版本衡查,我們需要尋找一個(gè)其他支持AndroidX的同樣功能的框架瘩欺,或者直接將第三方依賴clone下來(lái),自己修改成AndroidX的版本拌牲。