AndroidX 是 Google 2018 IO 大會推出的新擴展庫,主要是對 Android支持庫做了重大改進。與支持庫一樣,AndroidX 與 Android 作業系統分開提供,並與各個 Android 版本向後兼容,可以說 AndroidX 就是為了替換 Android 支持庫而設計的。
AndroidX 是 Android 團隊用於在Jetpack中開發、測試、打包和發布庫以及對其進行版本控制的開源項目。[摘自官方]
AndroidX 完全取代了支持庫,不僅提供同等的功能,而且提供了新的庫。
AndroidX 會將原始支持庫 API 軟體包映射到 androidx 命名空間。只有軟體包和 Maven 工件名稱發生了變化;類、方法和欄位名稱沒有改變。
與支持庫不同,AndroidX 軟體包會單獨維護和更新。androidx 軟體包使用嚴格的語義版本控制,從版本 1.0.0 開始,可以單獨更新項目中的 AndroidX 庫。
所有新支持庫的開發工作都將在 AndroidX 庫中進行,這包括維護原始支持庫工件和引入新的 Jetpack 組件。
1. 常見依賴庫映射
舊編譯工件AndroidX 編譯工件com.android.support.constraint:constraint-layoutandroidx.constraintlayout:constraintlayout:1.1.2com.android.support:appcompat-v7androidx.appcompat:appcompat:1.0.0com.android.support:cardview-v7androidx.cardview:cardview:1.0.0com.android.support:coordinatorlayoutandroidx.coordinatorlayout:coordinatorlayout:1.0.0com.android.support:designcom.google.android.material:material:1.0.0-rc01com.android.support:drawerlayoutandroidx.drawerlayout:drawerlayout:1.0.0com.android.support:gridlayout-v7androidx.gridlayout:gridlayout:1.0.0com.android.support:media2androidx.media2:media2:1.0.0-alpha03com.android.support:multidexandroidx.multidex:multidex:2.0.0com.android.support:percentandroidx.percentlayout:percentlayout:1.0.0com.android.support:recyclerview-v7androidx.recyclerview:recyclerview:1.0.0com.android.support:support-annotationsandroidx.annotation:annotation:1.0.0com.android.support:support-compatandroidx.core:core:1.0.0com.android.support:support-fragmentandroidx.fragment:fragment:1.0.0com.android.support:support-v4androidx.legacy:legacy-support-v4:1.0.0com.android.support:viewpagerandroidx.viewpager:viewpager:1.0.0com.android.support:swiperefreshlayoutandroidx.swiperefreshlayout:swiperefreshlayout:1.0.0更多詳細依賴庫變化,可查閱官方文檔(https://developer.android.com/jetpack/androidx/migrate#artifact_mappings)或下載這些映射的 CSV 格式(https://developer.android.com/topic/libraries/support-library/downloads/androidx-artifact-mapping.csv)文件。
2.常見類映射
支持庫類AndroidX 類android.arch.lifecycle.Lifecycleandroidx.lifecycle.Lifecycleandroid.support.v4.app.Fragmentandroidx.fragment.app.Fragmentandroid.support.v4.app.FragmentActivityandroidx.fragment.app.FragmentActivityandroid.support.v7.app.AppCompatActivityandroidx.appcompat.app.AppCompatActivityandroid.support.v7.app.ActionBarandroidx.appcompat.app.ActionBarandroid.support.v7.widget.RecyclerViewandroidx.recyclerview.widget.RecyclerViewandroid.support.design.card.MaterialCardViewcom.google.android.material.card.MaterialCardViewandroid.support.design.ripple.RippleUtilscom.google.android.material.ripple.RippleUtilsandroid.support.design.widget.CoordinatorLayoutandroidx.coordinatorlayout.widget.CoordinatorLayoutandroid.support.design.widget.NavigationViewcom.google.android.material.navigation.NavigationViewandroid.support.percent.PercentFrameLayoutandroidx.percentlayout.widget.PercentFrameLayout更多詳細支持類映射變化,可查閱官方文檔(https://developer.android.com/jetpack/androidx/migrate#artifact_mappings)或下載這些映射的CSV 格式(https://developer.android.com/topic/libraries/support-library/downloads/androidx-class-mapping.csv)文件。
下面是 Google 官方描述
Existing packages, such as the Android Support Library, are being refactored into AndroidX.1. 更新 Android Studio 與 Gradle 版本
將 Android studio 升級到 3.2 及以上;
Gradle 插件版本改為 4.6 及以上;
compileSdkVersion 版本升級到 28 及以上;
buildToolsVersion 版本改為 28.0.2 及以上。
2. 遷移 AndroidX 配置
android.useAndroidX=true
android.enableJetifier=true
備註:enableJetifier 如果取值為 false, 表示不遷移依賴包到 androidx,但在使用依賴包中的內容時可能會出現問題,當然了,如果你的項目中沒有使用任何三方依賴,那麼,此項可以設置為 false。
3. 修改依賴庫
修改項目 app 目錄下的 build.gradle 依賴庫,具體可以參照 AndroidX 變化中的依賴庫映射。
4. 依賴類重新導包
將原來 import 的 android.** 包刪除,重新 import 新的 androidx.** 包
import android.support.v7.app.AppCompatActivity; → import androidx.appcompat.app.AppCompatActivity;
5. 一鍵遷移 AndroidX 庫
AS 3.2 及以上版本提供了更加方便快捷的方法一鍵遷移到 AndroidX。選擇菜單上的 ReFactor —— Migrate to AndroidX... 即可。(如果遷移失敗,就需要重複上面 1,2,3,4 步手動去修改遷移)
備註:如果你的項目 compileSdkVersion 低於 28,點擊 Refactor to AndroidX... 會提示:
不可以共存。需要將依賴修改為Android Suppor或AndroidX中任一種。
不一定。部分控制項的包名/路徑名轉換的有問題,所以還需要我們手動調整(包括修改xml布局文件和.java/.kt 文件)。
在 AndroidStudio3.2 + androidx 環境下,對錯誤的檢查和處理更為嚴格。如果同一個xml布局文件中存在同名id,
在之前的版本中,我們可以正常編譯和運行,但是,在新的環境下, 必然會報錯,錯誤信息如下:
在遷移到 androidX 之前,我們為自定義控制項編寫自定義屬性時,可以與android已有的屬性重名,
但是,在AndroidX環境下不行了,如果存在重名的情況,必然會報錯——會提示你重複定義(詳細錯
誤信息沒截圖,但翻譯過來就是重複定義了attr/xxx)。
<declare-styleable name="RoundImageView">
...
<!-在遷移到androidx之前,這樣寫雖然不規範,但是能用,不報錯->
<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 這兩個註解無法遷移。之前有用戶在 Glide 中提過 issue: https://github.com/bumptech/glide/issues/3185
在上述 issue 中有用戶表示,將 Glide 升級到 4.8.0 之後,可以正常遷移。但是,我這邊並不行。然後,我先升級了 Glide , 又在 gralde 文件中增加了 support.annotation ,這樣才能正常編譯通過。貌似在後續 Glide 5.x 版本中會完成對 androidx 的完全兼容。
規範包名(即文件夾名)?
這裡所說的包名,指的是項目中的文件夾名稱。在之前版本中,我們命名包名時可能會出現大寫字母,雖然這並不符合 Java 命名規範,但起碼能正常編譯和運行。然而,升級到 AndroidStudio3.2 + androidX 環境後,必須嚴格遵守命名規範,否則,可能報錯,從而導致不能正常編譯和運行。
近期文章:
今日問題:
大家用Android X沒?
專屬升級社區:《這件事情,我終於想明白了》