還在用 android.support?谷歌強推 AndroidX 啦 [復制鏈接]

2019-10-29 09:57
littleRed 閱讀:445 評論:0 贊:0
Tag:  AndroidX

前言

AndroidX 是 Google 2018 IO 大會推出的新擴展庫,主要是對 Android支持庫做了重大改進。與支持庫一樣,AndroidX 與 Android 操作系統分開提供,并與各個 Android 版本向后兼容,可以說 AndroidX 就是為了替換 Android 支持庫而設計的。

1. AndroidX 是什么?

  • AndroidX 是 Android 團隊用于在Jetpack中開發、測試、打包和發布庫以及對其進行版本控制的開源項目。[摘自官方]

  • AndroidX 完全取代了支持庫,不僅提供同等的功能,而且提供了新的庫。

  • AndroidX 會將原始支持庫 API 軟件包映射到 androidx 命名空間。只有軟件包和 Maven 工件名稱發生了變化;類、方法和字段名稱沒有改變。

  • 與支持庫不同,AndroidX 軟件包會單獨維護和更新。androidx 軟件包使用嚴格的語義版本控制,從版本 1.0.0 開始,可以單獨更新項目中的 AndroidX 庫。

  • 所有新支持庫的開發工作都將在 AndroidX 庫中進行,這包括維護原始支持庫工件和引入新的 Jetpack 組件。

AndroidX 的變化

1. 常見依賴庫映射

舊編譯工件AndroidX 編譯工件
com.android.support.constraint:constraint-layoutandroidx.constraintlayout:constraintlayout:1.1.2
com.android.support:appcompat-v7androidx.appcompat:appcompat:1.0.0
com.android.support:cardview-v7androidx.cardview:cardview:1.0.0
com.android.support:coordinatorlayoutandroidx.coordinatorlayout:coordinatorlayout:1.0.0
com.android.support:designcom.google.android.material:material:1.0.0-rc01
com.android.support:drawerlayoutandroidx.drawerlayout:drawerlayout:1.0.0
com.android.support:gridlayout-v7androidx.gridlayout:gridlayout:1.0.0
com.android.support:media2androidx.media2:media2:1.0.0-alpha03
com.android.support:multidexandroidx.multidex:multidex:2.0.0
com.android.support:percentandroidx.percentlayout:percentlayout:1.0.0
com.android.support:recyclerview-v7androidx.recyclerview:recyclerview:1.0.0
com.android.support:support-annotationsandroidx.annotation:annotation:1.0.0
com.android.support:support-compatandroidx.core:core:1.0.0
com.android.support:support-fragmentandroidx.fragment:fragment:1.0.0
com.android.support:support-v4androidx.legacy:legacy-support-v4:1.0.0
com.android.support:viewpagerandroidx.viewpager:viewpager:1.0.0
com.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.Lifecycle
android.support.v4.app.Fragmentandroidx.fragment.app.Fragment
android.support.v4.app.FragmentActivityandroidx.fragment.app.FragmentActivity
android.support.v7.app.AppCompatActivityandroidx.appcompat.app.AppCompatActivity
android.support.v7.app.ActionBarandroidx.appcompat.app.ActionBar
android.support.v7.widget.RecyclerViewandroidx.recyclerview.widget.RecyclerView
android.support.design.card.MaterialCardViewcom.google.android.material.card.MaterialCardView
android.support.design.ripple.RippleUtilscom.google.android.material.ripple.RippleUtils
android.support.design.widget.CoordinatorLayoutandroidx.coordinatorlayout.widget.CoordinatorLayout
android.support.design.widget.NavigationViewcom.google.android.material.navigation.NavigationView
android.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)文件。

2. 為什么要遷移 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.

  • 大致意思是:現有的軟件包,如 Android 支持庫,正在被重構為 Androidx。盡管在 Google Maven 上仍然提供支持庫版本 27 及更低版本,但所有新開發將只包含在 Androidx 1.0.0 及更高版本中。

3. AndroidX 遷移步驟?

1. 更新 Android Studio 與 Gradle 版本

  • 將 Android studio 升級到 3.2 及以上;

  • Gradle 插件版本改為 4.6 及以上;

  • compileSdkVersion 版本升級到 28 及以上;

  • buildToolsVersion 版本改為 28.0.2 及以上。

2. 遷移 AndroidX 配置

  • 在項目的gradle.properties文件里添加如下配置:

android.useAndroidX=true
android.enableJetifier=true
配置說明
android.useAndroidX=true表示當前項目啟用 androidx
android.enableJetifier=true表示將依賴包也遷移到androidx

備注:enableJetifier 如果取值為 false, 表示不遷移依賴包到 androidx,但在使用依賴包中的內容時可能會出現問題,當然了,如果你的項目中沒有使用任何三方依賴,那么,此項可以設置為 false。

3. 修改依賴庫

修改項目 app 目錄下的 build.gradle 依賴庫,具體可以參照 AndroidX 變化中的依賴庫映射。

修改前修改后
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. 依賴類重新導包

將原來 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 步手動去修改遷移)

還在用 android.support?谷歌強推 AndroidX 啦

備注:如果你的項目 compileSdkVersion 低于 28,點擊 Refactor to AndroidX... 會提示:

還在用 android.support?谷歌強推 AndroidX 啦

Q&A

  • 同一個項目中 Android Support 和 AndroidX 可以共存嗎?

不可以共存。需要將依賴修改為Android Suppor或AndroidX中任一種。
  • 執行 Migrate to AndroidX 之后就完成 AndroidX 遷移了?

不一定。部分控件的包名/路徑名轉換的有問題,所以還需要我們手動調整(包括修改xml布局文件和.java/.kt 文件)。
  • DataBinding 中的錯誤(重名 id 錯誤)?

在 AndroidStudio3.2 + androidx 環境下,對錯誤的檢查和處理更為嚴格。如果同一個xml布局文件中存在同名id,
在之前的版本中,我們可以正常編譯和運行,但是,在新的環境下, 必然會報錯,錯誤信息如下:
還在用 android.support?谷歌強推 AndroidX 啦
  • attr.xml 中重復的屬性名稱會報錯?

在遷移到 androidX 之前,我們為自定義控件編寫自定義屬性時,可以與android已有的屬性重名,
但是,在AndroidX環境下不行了,如果存在重名的情況,必然會報錯——會提示你重復定義。
  • 錯誤示例

<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.Non 這兩個注解無法遷移。之前有用戶在 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 環境后,必須嚴格遵守命名規范,否則,可能報錯,從而導致不能正常編譯和運行。


我來說兩句
您需要登錄后才可以評論 登錄 | 立即注冊
facelist
所有評論(0)
領先的中文移動開發者社區
18620764416
7*24全天服務
意見反饋:[email protected]

掃一掃關注我們

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粵ICP備15117877號 )

重庆时时彩开奖模拟器 电影海报设计赚钱吗 快乐8开奖记录 普通人炒股能赚钱吗 重庆时时开奖结果记录 毫纤堂本草植物茶现在代理还赚钱 飞艇7码1期技巧 龙之谷手游 赚钱方法 AG空中战争现金游戏 麻将游戏赚钱提现 下周 股票推荐 收旧衣服怎么赚钱 内蒙古快3开奖号码