還在用android.support蹈集?該考慮遷移AndroidX了烁试!

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ì)的支示。

image

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)去修改遷移)

image

備注:如果你的項(xiàng)目compileSdkVersion 低于28植袍,點(diǎn)擊Refactor to AndroidX...會(huì)提示:

image

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ò)誤信息如下:
image
  • 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.CheckResultandroid.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)行键思。

參考:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末甫贯,一起剝皮案震驚了整個(gè)濱河市吼鳞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叫搁,老刑警劉巖赔桌,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異渴逻,居然都是意外死亡疾党,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)惨奕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雪位,“玉大人,你說(shuō)我怎么就攤上這事梨撞”⑾矗” “怎么了香罐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)时肿。 經(jīng)常有香客問(wèn)我庇茫,道長(zhǎng),這世上最難降的妖魔是什么螃成? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任旦签,我火速辦了婚禮,結(jié)果婚禮上锈颗,老公的妹妹穿的比我還像新娘顷霹。我一直安慰自己,他們只是感情好击吱,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布淋淀。 她就那樣靜靜地躺著,像睡著了一般覆醇。 火紅的嫁衣襯著肌膚如雪朵纷。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天永脓,我揣著相機(jī)與錄音袍辞,去河邊找鬼。 笑死常摧,一個(gè)胖子當(dāng)著我的面吹牛搅吁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播落午,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谎懦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了溃斋?” 一聲冷哼從身側(cè)響起界拦,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梗劫,沒(méi)想到半個(gè)月后享甸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梳侨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年蛉威,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猫妙。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓷翻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出割坠,到底是詐尸還是另有隱情齐帚,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布彼哼,位于F島的核電站对妄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏敢朱。R本人自食惡果不足惜剪菱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拴签。 院中可真熱鬧孝常,春花似錦、人聲如沸蚓哩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)岸梨。三九已至喜颁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間曹阔,已是汗流浹背半开。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赃份,地道東北人寂拆。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像抓韩,于是被迫代替她去往敵國(guó)和親纠永。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容