【解惑】Android Support 和 AndroidX

語言: CN / TW / HK

theme: smartblue

這是我參與11月更文挑戰的第6天,活動詳情檢視:2021最後一次更文挑戰

剛來這家公司時,正好趕上專案AndroidX遷移,踩了一些坑,記了些筆記,整理一下發一波~


0x1、Android Support Library的由來

Android 3.0 (API 11) 為了更好地相容平板,加入了Fragment,而想讓低版本的系統也能用上,需要做一個 向下相容,於是Android團隊推出了Android Support Library。

老Android們熟知的下述庫 (v後面的數字代表 最低相容API版本,如4對應Android 1.6) 都屬於Android Support Library:

  • com.android.support:support-v4 → Android 1.6,包含Fragment、NotificationCompat等控制元件,包含v7和v11的基礎功能,早期用到;
  • com.android.support:appcompat-v7:xx.xx → Android 2.1,增加了很多Material Design的相容類和素材,包含v4的全部內容,用得最多;
  • support-v13 → Android 3.2,為平板開發推出的版本相容包,Android 3.x系統是平板專用系統,用得不多;

Android版本更新飛快,現在都Android 12了,國內APP基本都最少相容Android 5.1 (API 21),這種v4、v7的命名早已沒太大的意義。

0x2、AndroidX Library的出現

從Android 9.0 (API 28) 開始,appcompat-v7:28.0.0 作為 Support Library的 終結版本,未來的新特性和改進都會進入AndroidX Library。升級內容主要有兩個方面:

  • 包名 → Support Library 中的API包名都是 android.support.,而AndroidX Library中的API都變成androidx.,意味著後續android.*包下的API都是隨系統釋出的,而androidx.包下的API都是隨著擴充套件庫釋出的,API基本不依賴於作業系統的具體版本;
  • 命名規則 → AndroidX Library 中所有的庫命名規則不再包含具體的作業系統API版本號,如下面的appcompat-v7變成了appcompat庫;

bash api 'com.android.support:appcompat-v7:28.0.0' api 'androidx.appcompat:appcompat:1.0.0'

0x3、從Support過渡到AndroidX

一鍵遷移

AS 3.2及以上版本提供了一鍵遷移到AndroidX的功能,依次點選選單欄的 Refactor → Migrate to AndroidX

注:一鍵遷移,compileSdkVersion需大於等於28,否則會提示:You need to have at least have compileSdk 28 set in your module build.gradle to refactor to androidx。

如果遷移失敗,就重複下面的①②③④步進行手動遷移吧~

① 版本要求

  • Android Studio → 升級到3.2及以上;
  • Gradle外掛 → 升級到4.6及以上,可在gradle/wrapper/gradle-wrapper.propertie 中修改distributionUrl指向版本號;
  • compileSdkVersion → 升級到28及以上;
  • buildToolsVersion → 升級到28.0.2及以上;

② 遷移AndroidX配置

在專案的gradle.properties檔案中新增下述配置:

```bash

當前專案啟用androidx

android.useAndroidX=true

將依賴包也遷移到androidx,一般寫true

如果設為false表不遷移依賴包到 androidx,如果有第三方依賴可能會出問題

android.enableJetifier=true ```

③ 修改依賴庫

參照AndroidX變化中的依賴庫對映改,可直接查 官方文件 或下載對映的 CSV檔案,修改示例如下:

```bash implementation com.android.support:cardview-v7 替換成→ implementation androidx.cardview:cardview

implementation com.android.support:collections 替換成 → implementation androidx.collection:collection

implementation com.android.support:coordinatorlayout 替換成 → androidx.coordinatorlayout:coordinatorlayout ```

④ 依賴類重新打包

參照AndroidX變化中的類對映改,可直接查 官方文件 或下載對映的 CSV檔案,修改示例如下:

```bash import android.support.v7.app.AlertDialog
修改成 → import androidx.appcompat.app.AlertDialog

import android.support.v7.app.AppCompatActivity 修改成 → import androidx.appcompat.app.AppCompatActivity ```

Tips:對了,還可能需要手動對混淆檔案proguard-rules進行修改~

0x4、一些問題收集

① Support 和 AndroidX 能共存嗎?

答:不可以,只能選一種。

② 執行完Migrate to AndroidX後就完成AndroidX遷移了?

答:不一定,部分報名/路徑名轉換可能有問題,有些還需手動調整 (xml、java、kt)

③ DataBinding中的錯誤(重名id錯誤)?

androidx中對錯誤的檢查和處理更嚴格,同一個xml佈局檔案中存在同名id會報錯。

④ attr.xml 中重複的屬性名稱會報錯?

答:自定義控制元件編寫自定義屬性,不能與android已有屬性重名,如textSize必須使用android:textSize。

⑤ Glide註解不相容AndroidX

答:Glide升級到4.8.0以後,具體可見官方issues

⑥ 沒有遷移到androidX,卻出現Support庫和AndroidX庫衝突?

答:大概率是依賴的第三方庫用到了AndroidX,可執行 gradlew :app:dependencies 檢視第三方的依賴樹,直接搜androidx的包。看官方從是哪個版本開始引用androidx庫的,回退到之前的版本即可。另外,建議引用依賴庫時使用具體的版本,而儘量避免使用latest.release或+方式。

參考文獻