AndroidX是Google 2018 IO 大會(huì)推出的新擴(kuò)展庫(kù),主要是對(duì)Android 支持庫(kù)做了重大改進(jìn)拢肆。與支持庫(kù)一樣减响,AndroidX 與 Android 操作系統(tǒng)分開(kāi)提供靖诗,并與各個(gè) Android 版本向后兼容,可以說(shuō)AndroidX就是為了替換Android支持庫(kù)而設(shè)計(jì)的支示。
AndroidX是什么刊橘?
- AndroidX 是 Android 團(tuán)隊(duì)用于在 Jetpack 中開(kāi)發(fā)、測(cè)試颂鸿、打包和發(fā)布庫(kù)以及對(duì)其進(jìn)行版本控制的開(kāi)源項(xiàng)目促绵。[摘自官方]
- AndroidX完全取代了支持庫(kù),不僅提供同等的功能嘴纺,而且提供了新的庫(kù)败晴。
- AndroidX 會(huì)將原始支持庫(kù) API 軟件包映射到 androidx 命名空間。只有軟件包和 Maven 工件名稱(chēng)發(fā)生了變化栽渴;類(lèi)位衩、方法和字段名稱(chēng)沒(méi)有改變。
- 與支持庫(kù)不同熔萧,AndroidX 軟件包會(huì)單獨(dú)維護(hù)和更新糖驴。androidx 軟件包使用嚴(yán)格的語(yǔ)義版本控制,從版本 1.0.0 開(kāi)始,可以單獨(dú)更新項(xiàng)目中的 AndroidX 庫(kù)佛致。
- 所有新支持庫(kù)的開(kāi)發(fā)工作都將在 AndroidX 庫(kù)中進(jìn)行,這包括維護(hù)原始支持庫(kù)工件和引入新的 Jetpack 組件贮缕。
AndroidX的變化
1.常見(jiàn)依賴(lài)庫(kù)映射
舊編譯工件 | AndroidX 編譯工件 |
---|---|
com.android.support.constraint:constraint-layout | androidx.constraintlayout:constraintlayout:1.1.2 |
com.android.support:appcompat-v7 | androidx.appcompat:appcompat:1.0.0 |
com.android.support:cardview-v7 | androidx.cardview:cardview:1.0.0 |
com.android.support:coordinatorlayout | androidx.coordinatorlayout:coordinatorlayout:1.0.0 |
com.android.support:design | com.google.android.material:material:1.0.0-rc01 |
com.android.support:drawerlayout | androidx.drawerlayout:drawerlayout:1.0.0 |
com.android.support:gridlayout-v7 | androidx.gridlayout:gridlayout:1.0.0 |
com.android.support:media2 | androidx.media2:media2:1.0.0-alpha03 |
com.android.support:multidex | androidx.multidex:multidex:2.0.0 |
com.android.support:percent | androidx.percentlayout:percentlayout:1.0.0 |
com.android.support:recyclerview-v7 | androidx.recyclerview:recyclerview:1.0.0 |
com.android.support:support-annotations | androidx.annotation:annotation:1.0.0 |
com.android.support:support-compat | androidx.core:core:1.0.0 |
com.android.support:support-fragment | androidx.fragment:fragment:1.0.0 |
com.android.support:support-v4 | androidx.legacy:legacy-support-v4:1.0.0 |
com.android.support:viewpager | androidx.viewpager:viewpager:1.0.0 |
com.android.support:swiperefreshlayout | androidx.swiperefreshlayout:swiperefreshlayout:1.0.0 |
更多詳細(xì)依賴(lài)庫(kù)變化,可查閱官方文檔或下載這些映射的 CSV 格式文件俺榆。
2.常見(jiàn)類(lèi)映射
支持庫(kù)類(lèi) | AndroidX 類(lèi) |
---|---|
android.arch.lifecycle.Lifecycle | androidx.lifecycle.Lifecycle |
android.support.v4.app.Fragment | androidx.fragment.app.Fragment |
android.support.v4.app.FragmentActivity | androidx.fragment.app.FragmentActivity |
android.support.v7.app.AppCompatActivity | androidx.appcompat.app.AppCompatActivity |
android.support.v7.app.ActionBar | androidx.appcompat.app.ActionBar |
android.support.v7.widget.RecyclerView | androidx.recyclerview.widget.RecyclerView |
android.support.design.card.MaterialCardView | com.google.android.material.card.MaterialCardView |
android.support.design.ripple.RippleUtils | com.google.android.material.ripple.RippleUtils |
android.support.design.widget.CoordinatorLayout | androidx.coordinatorlayout.widget.CoordinatorLayout |
android.support.design.widget.NavigationView | com.google.android.material.navigation.NavigationView |
android.support.percent.PercentFrameLayout | androidx.percentlayout.widget.PercentFrameLayout |
更多詳細(xì)支持類(lèi)映射變化感昼,可查閱官方文檔或下載這些映射的 CSV 格式文件。
為什么要遷移AndroidX罐脊?
下面是Google官方描述
Existing packages, such as the Android Support Library, are being refactored into AndroidX.
Although Support Library versions 27 and lower are still available on Google Maven,
all new development will be included in only AndroidX versions 1.0.0 and higher.
- 大致意思是:現(xiàn)有的軟件包定嗓,如Android支持庫(kù),正在被重構(gòu)為Androidx萍桌。盡管在Google Maven上仍然提供支持庫(kù)版本27及更低版本宵溅,但所有新開(kāi)發(fā)將只包含在Androidx 1.0.0及更高版本中。
AndroidX遷移步驟上炎?
1.更新Android Studio與Gradle版本
- 將Android studio升級(jí)到 3.2及以上恃逻;
- Gradle 插件版本改為4.6及以上;
- compileSdkVersion 版本升級(jí)到 28及以上藕施;
- buildToolsVersion 版本改為 28.0.2及以上寇损。
2.遷移AndroidX配置
- 在項(xiàng)目的gradle.properties文件里添加如下配置:
android.useAndroidX=true
android.enableJetifier=true
配置 | 說(shuō)明 |
---|---|
android.useAndroidX=true | 表示當(dāng)前項(xiàng)目啟用 androidx |
android.enableJetifier=true | 表示將依賴(lài)包也遷移到androidx |
備注:enableJetifier如果取值為false,表示不遷移依賴(lài)包到androidx,但在使用依賴(lài)包中的內(nèi)容時(shí)可能會(huì)出現(xiàn)問(wèn)題裳食,當(dāng)然了矛市,如果你的項(xiàng)目中沒(méi)有使用任何三方依賴(lài),那么诲祸,此項(xiàng)可以設(shè)置為false浊吏。
3.修改依賴(lài)庫(kù)
修改項(xiàng)目app目錄下的build.gradle依賴(lài)庫(kù)憨愉,具體可以參照AndroidX變化中的依賴(lài)庫(kù)映射。
修改前 | 修改后 |
---|---|
implementation 'com.android.support:appcompat-v7:28.0.2' | implementation 'androidx.appcompat:appcompat:1.0.0' |
implementation 'com.android.support:design:28.0.2' | implementation 'com.google.android.material:material:1.0.0' |
implementation 'com.android.support.constraint:constraint-layout:1.1.2' | implementation 'androidx.constraintlayout:constraintlayout:1.1.2' |
... | ... |
4.依賴(lài)類(lèi)重新導(dǎo)包
將原來(lái)import的android.包刪除卿捎,重新import新的androidx.包
import android.support.v7.app.AppCompatActivity; → import androidx.appcompat.app.AppCompatActivity;
5.一鍵遷移AndroidX庫(kù)
AS 3.2 及以上版本提供了更加方便快捷的方法一鍵遷移到 AndroidX配紫。選擇菜單上的ReFactor —— Migrate to AndroidX... 即可。(如果遷移失敗午阵,就需要重復(fù)上面1躺孝,2,3底桂,4步手動(dòng)去修改遷移)
備注:如果你的項(xiàng)目compileSdkVersion 低于28植袍,點(diǎn)擊Refactor to AndroidX...會(huì)提示:
Q&A
- 同一個(gè)項(xiàng)目中Android Support和AndroidX可以共存嗎?
不可以共存籽懦。需要將依賴(lài)修改為Android Suppor或AndroidX中任一種于个。
- 執(zhí)行Migrate to AndroidX之后就完成AndroidX遷移了?
不一定暮顺。部分控件的包名/路徑名轉(zhuǎn)換的有問(wèn)題厅篓,所以還需要我們手動(dòng)調(diào)整(包括修改xml布局文件和.java/.kt 文件)。
- DataBinding中的錯(cuò)誤(重名id錯(cuò)誤)捶码?
在 AndroidStudio3.2 + androidx 環(huán)境下羽氮,對(duì)錯(cuò)誤的檢查和處理更為嚴(yán)格。如果同一個(gè)xml布局文件中存在同名id惫恼,
在之前的版本中档押,我們可以正常編譯和運(yùn)行,但是祈纯,在新的環(huán)境下令宿, 必然會(huì)報(bào)錯(cuò),錯(cuò)誤信息如下:
- attr.xml 中重復(fù)的屬性名稱(chēng)會(huì)報(bào)錯(cuò)腕窥?
在遷移到 androidX 之前粒没,我們?yōu)樽远x控件編寫(xiě)自定義屬性時(shí),可以與android已有的屬性重名油昂,
但是革娄,在AndroidX環(huán)境下不行了,如果存在重名的情況冕碟,必然會(huì)報(bào)錯(cuò)——會(huì)提示你重復(fù)定義(詳細(xì)錯(cuò)
誤信息沒(méi)截圖,但翻譯過(guò)來(lái)就是重復(fù)定義了attr/xxx)匆浙。
- 錯(cuò)誤示例
<declare-styleable name="RoundImageView">
...
<!-在遷移到androidx之前安寺,這樣寫(xiě)雖然不規(guī)范,但是能用首尼,不報(bào)錯(cuò)->
<attr name="textSize" format="Integer" />
...
</declare-styleable>
- 正確示例
<declare-styleable name="RoundImageView">
...
<!-遷移到androidX之后挑庶,必須使用android:xxx 屬性言秸,不能定義android已有的屬性->
<attr name="android:textSize" />
...
</declare-styleable>
Glide中的注解不兼容androidX?
遷移到 androidX 之后迎捺,Glide中使用的 android.support.annotation.CheckResult 和 android.support.annotation.NonNull這兩個(gè)注解無(wú)法遷移举畸。之前有用戶(hù)在Glide中提過(guò)issue: https://github.com/bumptech/glide/issues/3185
在上述issue 中有用戶(hù)表示,將Glide升級(jí)到 4.8.0 之后凳枝,可以正常遷移抄沮。但是,我這邊并不行岖瑰。然后叛买,我先升級(jí)了Glide ,又在 gralde文件中增加了support.annotation ,這樣才能正常編譯通過(guò)蹋订。貌似在后續(xù)Glide 5.x 版本中會(huì)完成對(duì) androidx的完全兼容率挣。規(guī)范包名(即文件夾名)?
這里所說(shuō)的包名,指的是項(xiàng)目中的文件夾名稱(chēng)露戒。在之前版本中椒功,我們命名包名時(shí)可能會(huì)出現(xiàn)大寫(xiě)字母,雖然這并不符合Java命名規(guī)范智什,但起碼能正常編譯和運(yùn)行蛾茉。然而,升級(jí)到 AndroidStudio3.2 + androidX 環(huán)境后撩鹿,必須嚴(yán)格遵守命名規(guī)范谦炬,否則,可能報(bào)錯(cuò)节沦,從而導(dǎo)致不能正常編譯和運(yùn)行键思。
參考: