[译] Plaid 应用迁移到 AndroidX 的实践经历,Android程序员必会

变更最少的代码以保证应用可以仍能正常运行。

在运行 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前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

最后

**一个零基础的新人,我认为坚持是最最重要的。**我的很多朋友都找我来学习过,我也很用心的教他们,可是不到一个月就坚持不下来了。我认为他们坚持不下来有两点主要原因:

他们打算入行不是因为兴趣,而是因为所谓的IT行业工资高,或者说完全对未来没有任何规划。

刚开始学的时候确实很枯燥,这确实对你是个考验,所以说坚持下来也很不容易,但是如果你有兴趣就不会认为这是累,不会认为这很枯燥,总之还是贵在坚持。

技术提升遇到瓶颈了?缺高级Android进阶视频学习提升自己吗?还有大量大厂面试题为你面试做准备!

点击:Android 学习,面试文档,视频收集大整理

来获取学习资料提升自己去挑战一下BAT面试难关吧

对于很多Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些知识图谱希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

不论遇到什么困难,都不应该成为我们放弃的理由!

如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!

重要,希望读者们能谨记这一点。

不论遇到什么困难,都不应该成为我们放弃的理由!

如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!

最后祝各位新人都能坚持下来,学有所成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值