AndroidX是什么?
? ? ? ? 簡單來講AndroidX就是一個與平臺解綁的Appcompat(低版本兼容高版本功能)庫,也就是說在build.gradle中不需要再與compileSdkVersion寫成一樣,例如之前這樣的寫法:
compile 'com.android.support:appcompat-v7:24.+'
? ? ? ? (注:使用24.+則表明使用 24. 開頭的版本的最新版本,若直接使用+號則表明直接使用該庫的最新版本。
? ? ? ? 現在可以寫成:
implementation 'androidx.appcompat:appcompat:1.1.0-alpha02'
? ? ? ? (注:implementation與compile功能相同,但是implementation無法在該模塊內引用依賴的依賴,但compile可以,這么做的好處是可以加快編譯速度。新的api與compile完全相同,只是換了名字而已)
? ? ? ? 也就是說,在更換compileSdkVersion的時候不需要再去修改項目中的文件了,而且Google在appcompat庫28.0.0第一個正式版本發布之后,已經不再更新原有的appcompat庫,而是全面轉到整合開發AndroidX的任務上,這就意味著沒如果還使用原有的appcompat庫,如果,庫中的代碼出現了問題,Google將不會修復它,所以遷移到AndroidX是遲早的事情。
遷移到AndroidX
? ? ? ? 在Android Studio中的Refactor->Migrate to AndroidX的選項,點擊之后即可將項目遷移到AndroidX,在確認的時候他會提示你將項目備份以免遷移失敗時丟失原有項目,但是通常情況下不會遷移失敗,只是遷移的過程會花費很長的時間(如果項目很大,真的挺久,AS的CPU利用率為0也不要關閉,請耐心等待)。
? ? ? ? 如果發生遷移失敗,一般可能是原有工具Hook了appcompat庫造成的,這時候就需要手動遷移了。
? ? ? ? 此外,值得注意的是,AndroidX的更新頻率會比原來的appcompat庫要高,會經常改變底層實現,所以需要Hook appcompat庫的插件可能會出現一些問題,還有就是使用gradle依賴的一些第三方庫中的某些類可能繼承了android.support.v4包下的Fragment,但遷移到AndroidX后appcompat的Fragment變成了androidx.fragment.app包下,原有的代碼下會畫紅線,AS也會警告你出現錯誤,但是不用擔心,依然可以正常編譯,AS在編譯的時候會自動完成基類的替換,但前提是你要確保你的gradle.properties進行了如下設置。
android.useAndroidX=true
android.enableJetifier=true
? ? ? ? 你甚至可以直接新的Fragment使用這種方式強制轉換到原有的Fragment上,編譯時亦不會報錯
TextureSupportMapFragment mapFragment ? ? ? ? = TextureSupportMapFragment.class ? ? ? ? .cast(getChildFragmentManager() ? ? ? ? ? ? ? ? .findFragmentById(R.id.map_view));
? ? ? ? 同理,也可以將舊的Fragment強制類型轉換到新的Fragment上
Fragment f = Fragment.class.cast(mapFragment);
? ? ? ? (注:上面的TextureSupportMapFragment是一個典型案例,他是高德地圖SDK中的Fragment,本身已經繼承了v4.包下的Fragment,可以用過上面的轉換來使他兼容AndroidX)
? ? ? ? 雖然更新到AndroidX會出各種小問題,但面相未來開發,總體來說還是是利大于弊的。
? ? ? ? 如果你在查找一份AndroidX遷移前后庫與類的對照清單,我想你可能需要這個AndroidX遷移。
遷移到AndroidX的好處
? ? ? ? 1.Fragment終于能用了,以前Fragment的各種小問題,在AndroidX中基本都得到了解決。
? ? ? ? 2.AppCompatActivity的addOnBackPressedCallback方法。曾經很多人一直都詬病為什么Fragment不支持onBackPressed,簡直蛋疼,更新到AndroidX以后,你可以AppCompatActivity#addOnBackPressedCallback為Fragment添加類似于onBackPressed的功能。
? ? ? ? 3.其他一些新庫的支持。但是由于庫太多,大家可以自己去AndroidX Google 官方Git倉庫查看。
? ? ? ? 4.AndroidX是Jetpack組件包的基礎,如果要想使用Jetpack組件包的所有功能,還是比較建議遷移到AndroidX的。