摘要:它是對(duì)的重大改進(jìn)和全面替代方案。一個(gè)更直接的方法是開(kāi)始遷移,并且檢查可能出現(xiàn)的報(bào)錯(cuò)。遷移工具位于菜單欄的選項(xiàng)。這個(gè)選項(xiàng)將遷移整個(gè)項(xiàng)目的所有模塊。中的遷移工具是遷移的主要方式。遷移應(yīng)用變更最少的代碼以保證應(yīng)用可以仍能正常運(yùn)行。
原文地址:Cross-stitching Plaid and AndroidX
原文作者:Tiem Song
譯文出自:掘金翻譯計(jì)劃
本文永久鏈接:github.com/xitu/gold-m…
譯者:Mirosalva
校對(duì)者:PhxNirvana
一份 AndroidX 的遷移指南
由 Virginia Poltrack 提供圖片。
Plaid 是一款呈現(xiàn) Material Design 風(fēng)格和豐富交互界面的有趣應(yīng)用。最近這款應(yīng)用通過(guò)現(xiàn)今的 Android 應(yīng)用開(kāi)發(fā)技術(shù)實(shí)現(xiàn)了一番重構(gòu)。獲取更多應(yīng)用信息和重新設(shè)計(jì)的視覺(jué)效果,可以查閱 Restitching Plaid。
Restitching Plaid: 把 Plaid 更新到最新應(yīng)用標(biāo)準(zhǔn)
和大多數(shù) Android 應(yīng)用一樣,Plaid 依賴 Android Support Library,該庫(kù)可以為新 Android 特性提供向后兼容性,以便可以運(yùn)行在舊版操作系統(tǒng)的 Android 機(jī)上。在 2018 年的 9 月份,最新的 Support Library 版本(28.0.0)被發(fā)布,和 Support Library 一起發(fā)布的 Android 庫(kù)已經(jīng)被遷移到 AndroidX(除了 Design 庫(kù)被遷移到 Android 的 Material Components),并且這些庫(kù)的新增開(kāi)發(fā)都是基于 AndroidX。因此,接收 bug 修復(fù)、新功能和其他庫(kù)更新的唯一選擇就需要將 Plaid 遷移到 AndroidX。
什么是 AndroidX);在 2018 Google I/O 大會(huì)上,Android 團(tuán)隊(duì)發(fā)布了 AndroidX。它是 Android 團(tuán)隊(duì)用于開(kāi)發(fā)、測(cè)試、打包、定版以及在 Jetpack 中發(fā)布庫(kù)時(shí)所用到的開(kāi)源代碼。和 Support Library 類似,每一個(gè) AndroidX 庫(kù)都是獨(dú)立于 Android OS 來(lái)發(fā)布,并且提供了跨 Android 版本的向后兼容性。它是對(duì) Support Library 的重大改進(jìn)和全面替代方案。
閱讀下文來(lái)了解我們?nèi)绾螢檫w移過(guò)程準(zhǔn)備自己的代碼,以及執(zhí)行遷移過(guò)程。
遷移前準(zhǔn)備我強(qiáng)烈建議在一個(gè)版本可控的分支做遷移工作。這樣你可以逐步解決可能出現(xiàn)的任何遷移問(wèn)題,同時(shí)分離出每個(gè)變更用于分析定位問(wèn)題。你可以在這個(gè) Pull Request 下查看我們的討論過(guò)程,并且通過(guò)點(diǎn)擊下面的提交鏈接來(lái)跟進(jìn)最新信息。另外 Android Studio 提供了一個(gè)遷移前做工程備份的可選服務(wù)。
和任何大規(guī)模代碼的重構(gòu)工作一樣,最好在遷移到 AndroidX 期間,遷移分支與主要開(kāi)發(fā)分支之間做到最少合并來(lái)避免合并沖突。雖然對(duì)其他應(yīng)用來(lái)說(shuō)不可行,但是我們團(tuán)隊(duì)能夠臨時(shí)暫停向主分支提交代碼以幫助遷移。一次性遷移整個(gè)應(yīng)用也非常必要,因?yàn)椴糠诌w移——同時(shí)使用 AndroidX 和 Support 庫(kù)將會(huì)導(dǎo)致遷移過(guò)程中的失敗。
最后,請(qǐng)閱讀 developer.android.com 網(wǎng)站上遷移至 AndroidX 文中的提示?,F(xiàn)在讓我們開(kāi)始吧!
依賴標(biāo)識(shí)在你開(kāi)始之前,對(duì)代碼準(zhǔn)備的最重要的一點(diǎn)建議是:
確保你正在使用的依賴庫(kù)是與 AndroidX 兼容的。
依賴于一個(gè)舊版 support 庫(kù)的第三方庫(kù)可能與 AndroidX 不兼容,這很有可能導(dǎo)致你的應(yīng)用在遷移到 AndroidX 后無(wú)法編譯。檢查你的應(yīng)用任意依賴是否兼容的一個(gè)方法是訪問(wèn)這些依賴的項(xiàng)目站點(diǎn)。一個(gè)更直接的方法是開(kāi)始遷移,并且檢查可能出現(xiàn)的報(bào)錯(cuò)。
對(duì)于 Plaid 應(yīng)用,我們使用了一個(gè)與AndroidX 不兼容的圖形加載庫(kù) Glide 的舊版本(4.7.1)。這導(dǎo)致遷移后出現(xiàn)一個(gè)讓?xiě)?yīng)用無(wú)法構(gòu)建的代碼生成問(wèn)題(這是一個(gè)記錄在 Glide 工程下的類似問(wèn)題),在開(kāi)始遷移之前我們把 Glide 更新到版本 4.8.0(參考這次提交),這個(gè)版本添加了對(duì) AndroidX 注解的支持。
關(guān)于這一點(diǎn),請(qǐng)盡可能地更新到你的應(yīng)用所依賴第三方庫(kù)的最新版本。這對(duì) Support 庫(kù)而言尤其是一個(gè)好主意,因?yàn)樯?jí)到 28.0.0(截至撰寫(xiě)本文的最終版本)將使遷移更加順暢。
使用 Android Studio 進(jìn)行重構(gòu)遷移過(guò)程中我們使用了 Android Studio 3.2.1 版本中內(nèi)置的重構(gòu)工具。 AndroidX 遷移工具位于菜單欄的 Refactor > Migrate to AndroidX 選項(xiàng)。這個(gè)選項(xiàng)將遷移整個(gè)項(xiàng)目的所有模塊。
運(yùn)行 AndroidX 重構(gòu)工具后的預(yù)覽窗口。
如果你不使用 Android Studio 或者更傾向于其他工具來(lái)做遷移,請(qǐng)參考 Artifact 和 Class 來(lái)對(duì)比新舊支持庫(kù)間架構(gòu)和類的改動(dòng),這些材料也有提供 CSV 格式。
Android Studio 中的 AndroidX 遷移工具是 AndroidX 遷移的主要方式。這個(gè)工具正在持續(xù)的優(yōu)化中,所以如果你遇到問(wèn)題或者希望查看某個(gè)功能,請(qǐng)?jiān)?Google 問(wèn)題追蹤頁(yè)提交一票。
遷移應(yīng)用變更最少的代碼以保證應(yīng)用可以仍能正常運(yùn)行。
在運(yùn)行 AndroidX 遷移工具后,大量的代碼被變更,然而項(xiàng)目卻無(wú)法編譯成功。此時(shí),我們僅僅做了最少量的工作來(lái)使應(yīng)用重新運(yùn)行起來(lái)。
這個(gè)方法有利于把流程拆解為可控的步驟。我們留下了一些任務(wù),諸如修復(fù)導(dǎo)入順序、提取依賴變量、減少完整 classpath 的使用,以便后續(xù)的清理工作。
剛開(kāi)始出現(xiàn)的報(bào)錯(cuò)之一是重復(fù)的類 —— 像這種情況,PathSegment:
Execution failed for task :app:transformDexArchiveWithExternalLibsDexMergerForDebug.
> com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:
如何解決這個(gè)問(wèn)題參考這里: https://developer.android.com/studio/build/dependencies#duplicate_classes.
Program type already present: androidx.core.graphics.PathSegment
這是一個(gè)由遷移工具生成錯(cuò)誤依賴(androidx.core:core-ktx:0.3)導(dǎo)致的報(bào)錯(cuò)。我們手動(dòng)更新(參考這次提交)到正確的依賴版本(androidx.core:core-ktx:1.0.0)。這個(gè)bug 已經(jīng)在 Android Studio 3.3 Canary 9 及之后的版本被修復(fù)。我們指出這點(diǎn)是因?yàn)槟慊蛟S在遷移過(guò)程中會(huì)遇到類似的問(wèn)題。
接下來(lái),Palette API 在新版中變得可以為空,為了暫時(shí)避開(kāi)(參考這次提交)這點(diǎn),我們添加了!!(非空斷言操作符)。
然后我們遇到了一個(gè) plusAssign 缺失的報(bào)錯(cuò)。這個(gè)加載在 1.0.0 版本中被移除。plusAssign 的使用被臨時(shí)注釋掉了(參考這次提交)。本文的后面我們會(huì)研究對(duì) Palette 和 plusAssign 問(wèn)題的可持續(xù)解決方案。
現(xiàn)在應(yīng)用可以運(yùn)行了,到清理代碼的時(shí)候了!
清理代碼應(yīng)用在運(yùn)行中,但是我們的持續(xù)集成系統(tǒng)報(bào)告了代碼提交后的構(gòu)建錯(cuò)誤:
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")
}
我們依照測(cè)試日志中的參考建議,添加了缺失的依賴模塊(參考這次提交)。
我們也借此機(jī)會(huì)更新了我們的 Gradle 插件版本、Gradle wrapper 版本、Kotlin 版本(參考這次提交)。Android Studio 推薦我們安裝 28.0.3 版本的構(gòu)建工具,我們也照做了。在使用 Gradle 3.3.0-alpha13 版本插件時(shí)我們遇到的問(wèn)題,通過(guò)降級(jí)到 3.3.0-alpha8 版本的方式得到解決。
遷移工具的一個(gè)缺點(diǎn)是:如果你在依賴版本項(xiàng)使用了變量,遷移工具把它們自動(dòng)內(nèi)聯(lián)。我們從 build.gradle 文件中重新提取了這些版本(參考這次提交)。
上文中我們提到了運(yùn)行 AndroidX 遷移工具后對(duì) plusAssign 和 Palette 問(wèn)題的臨時(shí)解決方案。我們通過(guò)將 AndroidX 版本降低來(lái)重新添加了 plusAssign 函數(shù)和相關(guān)測(cè)試(參考這次提交),并且恢復(fù)了被注釋了的代碼。與此同時(shí),我們把 Palette 參數(shù)更新到可以為空的這個(gè)版本(參考這次提交),這樣就無(wú)需使用操作符 !!。
同樣的,自動(dòng)轉(zhuǎn)化可能使得某些類需要使用它們的完整類路徑。做最少的手工修正是一個(gè)好的思路。作為清理工作的一部分,我們移除了完整類路徑,并在必要時(shí)重新添加了相關(guān)引用。
最后,一些少量測(cè)試相關(guān)的修改被加入工程,圍繞著測(cè)試過(guò)程中的依賴沖突(參考這次提交)和 Room 的測(cè)試用例(參考這次提交)。這時(shí)我們的工程完成全部轉(zhuǎn)化,并且我們的測(cè)試都已通過(guò)。
結(jié)束過(guò)程盡管遇到了一些障礙,AndroidX 的遷移進(jìn)展得比較順利。遇到的問(wèn)題主要涉及依賴庫(kù)或類的錯(cuò)誤轉(zhuǎn)換,以及新庫(kù)中的 API 變化。 幸運(yùn)的是這些都相對(duì)容易解決。Plaid 現(xiàn)在已經(jīng)準(zhǔn)備好再被用起來(lái)了!
如果發(fā)現(xiàn)譯文存在錯(cuò)誤或其他需要改進(jìn)的地方,歡迎到 掘金翻譯計(jì)劃 對(duì)譯文進(jìn)行修改并 PR,也可獲得相應(yīng)獎(jiǎng)勵(lì)積分。文章開(kāi)頭的 本文永久鏈接 即為本文在 GitHub 上的 MarkDown 鏈接。
掘金翻譯計(jì)劃 是一個(gè)翻譯優(yōu)質(zhì)互聯(lián)網(wǎng)技術(shù)文章的社區(qū),文章來(lái)源為 掘金 上的英文分享文章。內(nèi)容覆蓋 Android、iOS、前端、后端、區(qū)塊鏈、產(chǎn)品、設(shè)計(jì)、人工智能等領(lǐng)域,想要查看更多優(yōu)質(zhì)譯文請(qǐng)持續(xù)關(guān)注 掘金翻譯計(jì)劃、官方微博、知乎專欄。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/7046.html
摘要:括號(hào)里面的參數(shù),表明需要監(jiān)聽(tīng)的是什么生命周期事件。主要就是通過(guò)和這兩個(gè)枚舉類來(lái)跟蹤所關(guān)聯(lián)組件的生命周期狀態(tài)。這點(diǎn)和或者更低版本上的生命周期的調(diào)用順序并不匹配,需要稍加注意。 前言 2018 年的 Google I/O 大會(huì)上,Google 發(fā)布了 Android Jetpack,并稱其為下一代的 Android 組件,旨在幫助開(kāi)發(fā)者加快應(yīng)用開(kāi)發(fā)速度。準(zhǔn)確來(lái)講,Jetpack 是一系列...
摘要:括號(hào)里面的參數(shù),表明需要監(jiān)聽(tīng)的是什么生命周期事件。主要就是通過(guò)和這兩個(gè)枚舉類來(lái)跟蹤所關(guān)聯(lián)組件的生命周期狀態(tài)。這點(diǎn)和或者更低版本上的生命周期的調(diào)用順序并不匹配,需要稍加注意。 前言 2018 年的 Google I/O 大會(huì)上,Google 發(fā)布了 Android Jetpack,并稱其為下一代的 Android 組件,旨在幫助開(kāi)發(fā)者加快應(yīng)用開(kāi)發(fā)速度。準(zhǔn)確來(lái)講,Jetpack 是一系列...
摘要:前言這將是一個(gè)分為兩部分,內(nèi)容是關(guān)于在生產(chǎn)環(huán)境下,跑應(yīng)用的最佳實(shí)踐。潛在的攻擊者可以通過(guò)它們進(jìn)行針對(duì)性的攻擊。 前言 這將是一個(gè)分為兩部分,內(nèi)容是關(guān)于在生產(chǎn)環(huán)境下,跑Express應(yīng)用的最佳實(shí)踐。第一部分會(huì)關(guān)注安全性,第二部分最會(huì)關(guān)注性能和可靠性。當(dāng)你讀這篇文章時(shí),假設(shè)你已經(jīng)對(duì)Node.js和web開(kāi)發(fā)有所了解,并且對(duì)生產(chǎn)環(huán)境有了概念。 概覽 生產(chǎn)環(huán)境,指的是軟件生命循環(huán)中的某個(gè)階段。...
閱讀 844·2023-04-25 19:43
閱讀 4109·2021-11-30 14:52
閱讀 3918·2021-11-30 14:52
閱讀 4024·2021-11-29 11:00
閱讀 3917·2021-11-29 11:00
閱讀 4035·2021-11-29 11:00
閱讀 3752·2021-11-29 11:00
閱讀 6597·2021-11-29 11:00