[譯] Plaid 應用遷移到 AndroidX 的實踐經歷

一份 AndroidX 的遷移指南html

Virginia Poltrack 提供圖片。前端

Plaid 是一款呈現 Material Design 風格和豐富交互界面的有趣應用。最近這款應用經過現今的 Android 應用開發技術實現了一番重構。獲取更多應用信息和從新設計的視覺效果,能夠查閱 Restitching Plaidandroid

和大多數 Android 應用同樣,Plaid 依賴 Android Support Library,該庫能夠爲新 Android 特性提供向後兼容性,以即可以運行在舊版操做系統的 Android 機上。在 2018 年的 9 月份,最新的 Support Library 版本(28.0.0)被髮布,和 Support Library 一塊兒發佈的 Android 庫已經被遷移到 AndroidX(除了 Design 庫被遷移到 Android 的 Material Components),而且這些庫的新增開發都是基於 AndroidX。所以,接收 bug 修復、新功能和其餘庫更新的惟一選擇就須要將 Plaid 遷移到 AndroidX。ios

什麼是 AndroidX?

在 2018 Google I/O 大會上,Android 團隊發佈了 AndroidX。它是 Android 團隊用於開發、測試、打包、定版以及在 Jetpack 中發佈庫時所用到的開源代碼。和 Support Library 相似,每個 AndroidX 庫都是獨立於 Android OS 來發布,而且提供了跨 Android 版本的向後兼容性。它是對 Support Library 的重大改進和全面替代方案。git

閱讀下文來了解咱們如何爲遷移過程準備本身的代碼,以及執行遷移過程。github

遷移前準備

我強烈建議在一個版本可控的分支作遷移工做。這樣你能夠逐步解決可能出現的任何遷移問題,同時分離出每一個變動用於分析定位問題。你能夠在這個 Pull Request 下查看咱們的討論過程,而且經過點擊下面的提交連接來跟進最新信息。另外 Android Studio 提供了一個遷移前作工程備份的可選服務。後端

和任何大規模代碼的重構工做同樣,最好在遷移到 AndroidX 期間,遷移分支與主要開發分支之間作到最少合併來避免合併衝突。雖然對其餘應用來講不可行,可是咱們團隊可以臨時暫停向主分支提交代碼以幫助遷移。一次性遷移整個應用也很是必要,由於部分遷移——同時使用 AndroidX 和 Support 庫將會致使遷移過程當中的失敗。bash

最後,請閱讀 developer.android.com 網站上遷移至 AndroidX 文中的提示。如今讓咱們開始吧!架構

依賴標識

在你開始以前,對代碼準備的最重要的一點建議是:app

確保你正在使用的依賴庫是與 AndroidX 兼容的。

依賴於一箇舊版 support 庫的第三方庫可能與 AndroidX 不兼容,這頗有可能致使你的應用在遷移到 AndroidX 後沒法編譯。檢查你的應用任意依賴是否兼容的一個方法是訪問這些依賴的項目站點。一個更直接的方法是開始遷移,而且檢查可能出現的報錯。

對於 Plaid 應用,咱們使用了一個與AndroidX 不兼容的圖形加載庫 Glide 的舊版本(4.7.1)。這致使遷移後出現一個讓應用沒法構建的代碼生成問題(這是一個記錄在 Glide 工程下的相似問題),在開始遷移以前咱們把 Glide 更新到版本 4.8.0(參考此次提交),這個版本添加了對 AndroidX 註解的支持。

關於這一點,請儘量地更新到你的應用所依賴第三方庫的最新版本。這對 Support 庫而言尤爲是一個好主意,由於升級到 28.0.0(截至撰寫本文的最終版本)將使遷移更加順暢。

使用 Android Studio 進行重構

遷移過程當中咱們使用了 Android Studio 3.2.1 版本中內置的重構工具。 AndroidX 遷移工具位於菜單欄的 Refactor > Migrate to AndroidX 選項。這個選項將遷移整個項目的全部模塊。

運行 AndroidX 重構工具後的預覽窗口。

若是你不使用 Android Studio 或者更傾向於其餘工具來作遷移,請參考 ArtifactClass 來對比新舊支持庫間架構和類的改動,這些材料也有提供 CSV 格式。

Android Studio 中的 AndroidX 遷移工具是 AndroidX 遷移的主要方式。這個工具正在持續的優化中,因此若是你遇到問題或者但願查看某個功能,請在 Google 問題追蹤頁提交一票

遷移應用

變動最少的代碼以保證應用能夠仍能正常運行。

在運行 AndroidX 遷移工具後,大量的代碼被變動,然而項目卻沒法編譯成功。此時,咱們僅僅作了最少許的工做來使應用從新運行起來。

這個方法有利於把流程拆解爲可控的步驟。咱們留下了一些任務,諸如修復導入順序、提取依賴變量、減小完整 classpath 的使用,以便後續的清理工做。

剛開始出現的報錯之一是重複的類 —— 像這種狀況,PathSegment

Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.

> com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:

如何解決這個問題參考這裏: https://developer.android.com/studio/build/dependencies#duplicate_classes.

Program type already present: androidx.core.graphics.PathSegment
複製代碼

這是一個由遷移工具生成錯誤依賴(androidx.core:core-ktx:0.3)致使的報錯。咱們手動更新(參考此次提交)到正確的依賴版本(androidx.core:core-ktx:1.0.0)。這個bug 已經在 Android Studio 3.3 Canary 9 及以後的版本被修復。咱們指出這點是由於你或許在遷移過程當中會遇到相似的問題。

接下來,Palette API 在新版中變得能夠爲空,爲了暫時避開(參考此次提交)這點,咱們添加了!!非空斷言操做符)。

而後咱們遇到了一個 plusAssign 缺失的報錯。這個加載在 1.0.0 版本中被移除。plusAssign 的使用被臨時註釋掉了(參考此次提交)。本文的後面咱們會研究對 PaletteplusAssign 問題的可持續解決方案。

如今應用能夠運行了,到清理代碼的時候了!

清理代碼

應用在運行中,可是咱們的持續集成系統報告了代碼提交後的構建錯誤:

Execution failed for task ':designernews:checkDebugAndroidTestClasspath'.

> Conflict with dependency 'androidx.arch.core:core-runtime' in project ':designernews'. 

Resolved versions for runtime classpath (2.0.0) and compile classpath (2.0.1-alpha01) differ. This can lead to runtime crashes. 

To resolve this issue follow advice at https://developer.android.com/studio/build/gradle-tips#configure-project-wide-properties.

Alternatively, you can try to fix the problem by adding this snippet to /.../plaid/designernews/build.gradle:

  dependencies {
    implementation("androidx.arch.core:core-runtime:2.0.1-alpha01")
  }
複製代碼

咱們依照測試日誌中的參考建議,添加了缺失的依賴模塊(參考此次提交)。

咱們也藉此機會更新了咱們的 Gradle 插件版本、Gradle wrapper 版本、Kotlin 版本(參考此次提交)。Android Studio 推薦咱們安裝 28.0.3 版本的構建工具,咱們也照作了。在使用 Gradle 3.3.0-alpha13 版本插件時咱們遇到的問題,經過降級到 3.3.0-alpha8 版本的方式獲得解決。

遷移工具的一個缺點是:若是你在依賴版本項使用了變量,遷移工具把它們自動內聯。咱們從 build.gradle 文件中從新提取了這些版本(參考此次提交)。

上文中咱們提到了運行 AndroidX 遷移工具後對 plusAssignPalette 問題的臨時解決方案。咱們經過將 AndroidX 版本下降來從新添加了 plusAssign 函數和相關測試(參考此次提交),而且恢復了被註釋了的代碼。與此同時,咱們把 Palette 參數更新到能夠爲空的這個版本(參考此次提交),這樣就無需使用操做符 !!

一樣的,自動轉化可能使得某些類須要使用它們的完整類路徑。作最少的手工修正是一個好的思路。做爲清理工做的一部分,咱們移除了完整類路徑,並在必要時從新添加了相關引用。

最後,一些少許測試相關的修改被加入工程,圍繞着測試過程當中的依賴衝突(參考此次提交)和 Room 的測試用例(參考此次提交)。這時咱們的工程完成所有轉化,而且咱們的測試都已經過。

結束過程

儘管遇到了一些障礙,AndroidX 的遷移進展得比較順利。遇到的問題主要涉及依賴庫或類的錯誤轉換,以及新庫中的 API 變化。 幸運的是這些都相對容易解決。Plaid 如今已經準備好再被用起來了!

若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索