title: androidx遷移
date: 2019-10-15 11:49:20
tags: Androidx
Androidx 遷移總結(jié)
一处硬、什么是androidx
背景
隨著android版本的不斷迭代更新,每個版本中都會有新的API加入毒费,但是新加入的API在老的版本里并不存在牺陶,因此就出現(xiàn)了向下兼容的問題伟阔。于是android團(tuán)隊就退出了大名鼎鼎的支持庫Android Support Library
,用于提供向下兼容的功能。比如我們每個人都熟知的support-v4掰伸、suport-v7都是屬于Android Support Library
皱炉。
隨著支持庫版本的迭代,從最初的android Support v4到后來的v7狮鸭、v13,以及在這其中又對支持庫的內(nèi)部拆分合搅,使得支持庫變得龐大而復(fù)雜多搀。同時,支持庫具體版本的最低支持的系統(tǒng)版本也在發(fā)生著變化历筝,比如android Support v4,最初的命名含義就是最低支持API 4,但是到后來最低支持9酗昼、14等。含義的變化使得開發(fā)者在引入的時候不得不慎重核實梳猪。
且支持庫為了更好地利用Android系統(tǒng)自身的一些新特性,每個版本的支持庫內(nèi)部又針對不同的編譯版本蒸痹,劃分出了對各支持庫細(xì)分版本春弥。后來,開發(fā)者引入時叠荠,需要引入與當(dāng)前項目編譯版本對應(yīng)的匿沛,且滿足當(dāng)前項目最低支持構(gòu)建版本的具體支持庫版本。比如常見的寫法:
//支持庫
support_support_annotations : "com.android.support:support-annotations:$versions.support",
support_appcompat_v7 : "com.android.support:appcompat-v7:$versions.support",
support_recyclerview_v7 : "com.android.support:recyclerview-v7:$versions.support",
support_cardview_v7 : "com.android.support:cardview-v7:$versions.support",
support_design : "com.android.support:design:$versions.support",
support_support_v4 : "com.android.support:support-v4:$versions.support",
support_support_core_utils : "com.android.support:support-core-utils:$versions.support",
其中versions.support
需要與項目編譯版本保持一致榛鼎,至少需要在大的Api Level上保持一致逃呼。
由于支持庫過于混亂,最終導(dǎo)致的問題就是者娱,開發(fā)者不方便使用抡笼,官方維護(hù)也困難。所以需要對支持庫做一次統(tǒng)一的梳理黄鳍。
androidx華麗登場
Android 官方于2018年Google I/O 大會發(fā)布了AndroidX推姻。
AndroidX對原始的Android支持庫做了重大的改進(jìn)。AndroidX完全取代了支持庫框沟,不僅提供同等的功能藏古,而且提供了新的庫。而且AndroidX還包括以下功能:
AndroidX 中的所有軟件包都使用一致的命名空間忍燥,以字符串 "androidx." 開頭(除了 Design 庫被遷移到 Android 的 Material Components)拧晕。有關(guān)所有舊類到新類以及舊編譯工件到新編譯工件的完整映射,請參閱軟件包重構(gòu)頁面梅垄。
與支持庫不同厂捞,AndroidX 對各個Libray分開設(shè)立單獨的版本管理,并且都嚴(yán)格遵守語義版本控制哎甲。
所有支持庫新的API都在
AndroidX
中更新蔫敲,包括原始支持庫工件和引入新的 Jetpack 組件。
由于各個單獨Library的獨立版本管理炭玫,開發(fā)者就可以精確指定需要依賴的library,避免不必要的導(dǎo)入奈嘿,從而減小代碼體積。并且開發(fā)者在引入時吞加,只需要關(guān)注AndroidX中具體的需要引入的構(gòu)件版本即可裙犹。且大部分具體的構(gòu)件尽狠,具有一致的版本號。開發(fā)者使用起來不再需要關(guān)注項目自身的最低支持版本和編譯版本了叶圃,只需要像引入其他的第三方庫一樣袄膏,v1.0、v2.0掺冠、v3.0這種方式引入即可沉馆。
如原有的引入寫法
com.android.support:recyclerview-v7:28.0.0
變成了
androidx.recyclerview:recyclerview:1.0.0
二、為什么遷移
AndroidX相較于原始支持庫更友好德崭,同時斥黑,官方文檔明確表示原始支持庫后續(xù)將不再維護(hù)。另外眉厨,在Android Studio新建模塊時锌奴,如果沒有遷移到AndroidX,模塊是創(chuàng)建不了的。
新建項目時也是默認(rèn)使用androidX庫憾股,并且是無法取消的鹿蜀。
說明官方已經(jīng)開始強制開發(fā)者遷移到AndroidX.
而且,主流的第三方庫如butterknife
服球、glide
等都已適配AndroidX茴恰。如果要用使用它們的新特性,遷移到androidX也是前提有咨。
三琐簇、怎么遷移
前提準(zhǔn)備
- Android Studio 3.2及以上。當(dāng)前時點最新版本已經(jīng)是3.5.1穩(wěn)定版了座享。
- AGP版本3.2.0及以上婉商,對應(yīng)的Gradle版本4.6及以上。
- 項目編譯版本28及以上渣叛。
注意:
最好在一個版本可控的分支進(jìn)行遷移丈秩,因為涉及到變動的類或文件會非常多,避免合并代碼時沖突淳衙。
同時,分離出沒次變更蘑秽,以便于分析定位問題。
遷移過程
Android官方提供了具體的遷移文檔:
https://developer.android.com/jetpack/androidx/migrate
Android Studio一鍵遷移
Android Studio 3.2 及以上版本提供了更加方便快捷的方法一鍵遷移到 AndroidX箫攀,Refactor > Migrate to AndroidX
:
然而肠牲,一鍵遷移并不是萬能的,有些庫還是無法很好識別并遷移靴跛,還是需要手動遷移缀雳。
四、遇到的問題
1. 部分庫不會自動替換梢睛,需要手動替換
design庫肥印,因為并不是以androidx.
開頭,并沒有自動替換掉识椰,比如:
android.support.design.widget.AppBarLayout
替換成
com.google.android.material.appbar.AppBarLayout
coordinatorlayout庫,
如:
android.support.design.widget.CoordinatorLayout
替換成
androidx.coordinatorlayout.widget.CoordinatorLayout
布局文件
部分布局文件還是需要手動進(jìn)行替換深碱。
比較保險的解決方案:
全局搜索android.support
腹鹉,然后一個一個找(任意文件),然后在官方遷移文檔找到原先支持庫對應(yīng)的AndroidX庫敷硅,進(jìn)行替換功咒。
注意:
:如果項目中用到FilProvider
,會搜索到android.support.FILE_PROVIDER_PATHS
,這個是不用改的。參考資料
2. Glide中使用的 android.support.annotation.CheckResult
和 android.support.annotation.NonNull
這兩個注解無法遷移
查看Glide倉庫發(fā)現(xiàn)有人提過issue:https://github.com/bumptech/glide/issues/3185
解決:
升級Glide版本到4.8.0
或更高,問題解決绞蹦。
3. Butterknife
依賴編譯無法通過航瞭。
解決:
由于Butterknife
中用到android.support.v4.content
包,而在AndroidX中找不到了所以報錯坦辟。
解決: 升級Butterknife到10.0.0或更高版本,問題解決章办。