AndroidX是什么?
? ? ? ? 簡單來講AndroidX就是一個與平臺解綁的Appcompat(低版本兼容高版本功能)庫碎赢,也就是說在build.gradle中不需要再與compileSdkVersion寫成一樣,例如之前這樣的寫法:
compile 'com.android.support:appcompat-v7:24.+'
? ? ? ? (注:使用24.+則表明使用 24. 開頭的版本的最新版本薛夜,若直接使用+號則表明直接使用該庫的最新版本籍茧。
? ? ? ? 現(xiàn)在可以寫成:
implementation 'androidx.appcompat:appcompat:1.1.0-alpha02'
? ? ? ? (注:implementation與compile功能相同,但是implementation無法在該模塊內(nèi)引用依賴的依賴却邓,但compile可以硕糊,這么做的好處是可以加快編譯速度。新的api與compile完全相同腊徙,只是換了名字而已)
? ? ? ? 也就是說简十,在更換compileSdkVersion的時候不需要再去修改項(xiàng)目中的文件了,而且Google在appcompat庫28.0.0第一個正式版本發(fā)布之后撬腾,已經(jīng)不再更新原有的appcompat庫螟蝙,而是全面轉(zhuǎn)到整合開發(fā)AndroidX的任務(wù)上,這就意味著沒如果還使用原有的appcompat庫民傻,如果胰默,庫中的代碼出現(xiàn)了問題,Google將不會修復(fù)它漓踢,所以遷移到AndroidX是遲早的事情牵署。
遷移到AndroidX
? ? ? ? 在Android Studio中的Refactor->Migrate to AndroidX的選項(xiàng),點(diǎn)擊之后即可將項(xiàng)目遷移到AndroidX喧半,在確認(rèn)的時候他會提示你將項(xiàng)目備份以免遷移失敗時丟失原有項(xiàng)目奴迅,但是通常情況下不會遷移失敗,只是遷移的過程會花費(fèi)很長的時間(如果項(xiàng)目很大挺据,真的挺久取具,AS的CPU利用率為0也不要關(guān)閉,請耐心等待)扁耐。
? ? ? ? 如果發(fā)生遷移失敗暇检,一般可能是原有工具Hook了appcompat庫造成的,這時候就需要手動遷移了婉称。
? ? ? ? 此外块仆,值得注意的是,AndroidX的更新頻率會比原來的appcompat庫要高王暗,會經(jīng)常改變底層實(shí)現(xiàn)榨乎,所以需要Hook appcompat庫的插件可能會出現(xiàn)一些問題,還有就是使用gradle依賴的一些第三方庫中的某些類可能繼承了android.support.v4包下的Fragment瘫筐,但遷移到AndroidX后appcompat的Fragment變成了androidx.fragment.app包下,原有的代碼下會畫紅線铐姚,AS也會警告你出現(xiàn)錯誤策肝,但是不用擔(dān)心肛捍,依然可以正常編譯,AS在編譯的時候會自動完成基類的替換之众,但前提是你要確保你的gradle.properties進(jìn)行了如下設(shè)置拙毫。
android.useAndroidX=true
android.enableJetifier=true
? ? ? ? 你甚至可以直接新的Fragment使用這種方式強(qiáng)制轉(zhuǎn)換到原有的Fragment上,編譯時亦不會報(bào)錯
TextureSupportMapFragment mapFragment ? ? ? ? = TextureSupportMapFragment.class ? ? ? ? .cast(getChildFragmentManager() ? ? ? ? ? ? ? ? .findFragmentById(R.id.map_view));
? ? ? ? 同理棺禾,也可以將舊的Fragment強(qiáng)制類型轉(zhuǎn)換到新的Fragment上
Fragment f = Fragment.class.cast(mapFragment);
? ? ? ? (注:上面的TextureSupportMapFragment是一個典型案例缀蹄,他是高德地圖SDK中的Fragment,本身已經(jīng)繼承了v4.包下的Fragment膘婶,可以用過上面的轉(zhuǎn)換來使他兼容AndroidX)
? ? ? ? 雖然更新到AndroidX會出各種小問題缺前,但面相未來開發(fā),總體來說還是是利大于弊的悬襟。
? ? ? ? 如果你在查找一份AndroidX遷移前后庫與類的對照清單衅码,我想你可能需要這個AndroidX遷移。
遷移到AndroidX的好處
? ? ? ? 1.Fragment終于能用了脊岳,以前Fragment的各種小問題逝段,在AndroidX中基本都得到了解決。
? ? ? ? 2.AppCompatActivity的addOnBackPressedCallback方法割捅。曾經(jīng)很多人一直都詬病為什么Fragment不支持onBackPressed奶躯,簡直蛋疼,更新到AndroidX以后亿驾,你可以AppCompatActivity#addOnBackPressedCallback為Fragment添加類似于onBackPressed的功能嘹黔。
? ? ? ? 3.其他一些新庫的支持。但是由于庫太多颊乘,大家可以自己去AndroidX Google 官方Git倉庫查看参淹。
? ? ? ? 4.AndroidX是Jetpack組件包的基礎(chǔ),如果要想使用Jetpack組件包的所有功能乏悄,還是比較建議遷移到AndroidX的浙值。