Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >提示[译] Plaid 应用迁移到 AndroidX 的实践经历

提示[译] Plaid 应用迁移到 AndroidX 的实践经历

作者头像
Android 开发者
发布于 2019-05-17 07:16:46
发布于 2019-05-17 07:16:46
1.2K00
代码可运行
举报
文章被收录于专栏:Android 开发者Android 开发者
运行总次数:0
代码可运行

一份 AndroidX 的迁移指南

Virginia Poltrack 提供图片。

Plaid 是一款呈现 Material Design 风格和丰富交互界面的有趣应用。最近这款应用通过现今的 Android 应用开发技术实现了一番重构。获取更多应用信息和重新设计的视觉效果,可以查阅 Restitching Plaid

和大多数 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。

什么是 AndroidX?

在 2018 Google I/O 大会上,Android 团队发布了 AndroidX。它是 Android 团队用于开发、测试、打包、定版以及在 Jetpack 中发布库时所用到的开源代码。和 Support Library 类似,每一个 AndroidX 库都是独立于 Android OS 来发布,并且提供了跨 Android 版本的向后兼容性。它是对 Support Library 的重大改进和全面替代方案。

阅读下文来了解我们如何为迁移过程准备自己的代码,以及执行迁移过程。

迁移前准备

我强烈建议在一个版本可控的分支做迁移工作。这样你可以逐步解决可能出现的任何迁移问题,同时分离出每个变更用于分析定位问题。你可以在这个 Pull Request 下查看我们的讨论过程,并且通过点击下面的提交链接来跟进最新信息。另外 Android Studio 提供了一个迁移前做工程备份的可选服务。

和任何大规模代码的重构工作一样,最好在迁移到 AndroidX 期间,迁移分支与主要开发分支之间做到最少合并来避免合并冲突。虽然对其他应用来说不可行,但是我们团队能够临时暂停向主分支提交代码以帮助迁移。一次性迁移整个应用也非常必要,因为部分迁移——同时使用 AndroidX 和 Support 库将会导致迁移过程中的失败。

最后,请阅读 developer.android.com 网站上迁移至 AndroidX 文中的提示。现在让我们开始吧!

依赖标识

在你开始之前,对代码准备的最重要的一点建议是:

确保你正在使用的依赖库是与 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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 问题的可持续解决方案。

现在应用可以运行了,到清理代码的时候了!

清理代码

应用在运行中,但是我们的持续集成系统报告了代码提交后的构建错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 现在已经准备好再被用起来了!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年05月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android Jetpack架构组件(一)与AndroidX
自2008年9月22日谷歌发布Android 1.0版本到前不久Android 12版本到发布,Android已经陪伴我们走过了12个年头。可以说,经过12年的打磨和沉淀,Android的技术体系已经非常的成熟了。比如说,一开始时框架很少,也没有什么规范,所有的代码都是要自己写,但是现在,我们很少会关系这种基础代码,因为一些框架和工具的出现正在帮助开发者完成这方面的工作。
xiangzhihong
2020/12/21
2.4K0
[译] Plaid 应用迁移到 AndroidX 的实践经历
Plaid 是一款呈现 Material Design 风格和丰富交互界面的有趣应用。最近这款应用通过现今的 Android 应用开发技术实现了一番重构。获取更多应用信息和重新设计的视觉效果,可以查阅 Restitching Plaid。
Android 开发者
2022/09/20
1.2K0
[译] Plaid 应用迁移到 AndroidX 的实践经历
AndroidX库和一般库的详细对比以及迁移中遇到的坑总结
本文同步发布在Github:Android Studio版本、Gradle版本、Build Tools版本、AndroidX对照详细解答
AWeiLoveAndroid
2019/08/16
2.4K0
是时候迁移至 AndroidX 了!
长久以来,我们致力于做到三件事: 实践指南、减少模板代码和简化任务流程,我们希望帮助开发者们集中精力专注在真正需要考虑的逻辑中去。Jetpack 为此而生,它所包含的库、工具和指南,可以帮助您更轻松地编写高质量的应用。
扔物线
2020/04/27
1.1K0
是时候迁移至 AndroidX 了!
是时候迁移至 AndroidX 了!
长久以来,我们致力于做到三件事: 实践指南、减少模板代码和简化任务流程,我们希望帮助开发者们集中精力专注在真正需要考虑的逻辑中去。Jetpack 为此而生,它所包含的库、工具和指南,可以帮助您更轻松地编写高质量的应用。
Android 开发者
2020/11/15
1.3K0
是时候迁移至 AndroidX 了!
Android 现有项目迁移到androidx
我在全新项目中用过androidx,也做过老项目迁移到androidx,所以,我想表达的是androidx其实没那么神秘,也没那么多坑,时至今日也一年多过去了,基本趋于稳定,未来也是大势所趋,所以,迁移是迟早的事。
yechaoa
2022/06/10
9360
Android 现有项目迁移到androidx
【错误记录】Android Studio 编译报错 ( The minCompileSdk (33) specified in a dependency‘s AAR metadata META-I )
问题是 androidx.core:core:1.9.0. 依赖库中 要求的 minCompileSdk 为 33 , 本应用的编译版本为 32 , 这里设置为 33 即可解决 , 但是这样设置会造成其它问题 ;
韩曙亮
2023/03/30
4.3K0
【错误记录】Android Studio 编译报错 ( The minCompileSdk (33) specified in a dependency‘s AAR metadata META-I )
Android Support 和 AndroidX
0x1、Android Support Library的由来 Android 3.0 (API 11) 为了更好地兼容平板,加入了Fragment,而想让低版本的系统也能用上,需要做一个 向下兼容,于是Android团队推出了Android Support Library。
易寒
2021/12/16
2.7K0
[译] 格子拼贴 — 关于模块化的故事
在这篇文章中,我将全面介绍如何将一个整体的、庞大的、普通的应用转化为一个模块化应用束。以下是我们已取得的成果:
Android 开发者
2024/01/28
2910
[译] 格子拼贴 — 关于模块化的故事
将构建配置从 Groovy 迁移到 KTS
作为Android开发习惯了面向对象编程,习惯了IDEA提供的各种辅助开发快捷功能。
静默加载
2021/06/28
4.1K0
将构建配置从 Groovy 迁移到 KTS
Android Support vs AndroidX
Android 3.0 (API 11) 为了更好地兼容平板,加入了Fragment,而想让低版本的系统也能用上,需要做一个向下兼容,于是Android团队推出了Android Support Library。
Ant丶
2022/03/01
1.4K0
Android编程之Navigation项目迁移AndroidX踩坑记录
androidx 是对 android.support.xxx 包的整理后产物。由于之前的support包过于混乱,所以,google推出了 androidX。
宋天伦
2020/07/15
1.7K0
Android 重构 | 统一管理 Gradle 依赖版本
好代码,总是要经历多个阶段,从匆忙赶工上线,到慢慢细致打磨,折腾的过程,美好的结果。
贺biubiu
2020/05/22
1.3K0
【错误记录】Android Studio 编译报错 ( Module was compiled with an incompatible version of Kotlin. ) 2
在之前遇到过类似问题 【错误记录】Android Studio 编译报错 ( Module was compiled with an incompatible version of Kotlin. The binary ) , 报错的依赖库不同 , 本篇博客再次分析一遍 ;
韩曙亮
2023/03/30
4.7K0
【错误记录】Android Studio 编译报错 ( Module was compiled with an incompatible version of Kotlin. ) 2
android离线打包[通俗易懂]
Android Studio 链接:Download Android Studio and SDK tools | Android Developers
全栈程序员站长
2022/11/15
1.9K0
android离线打包[通俗易懂]
【错误记录】在 Android Studio 的 Terminal 终端执行 gradlew 报错 ( 无法将“gradlew”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称 )
在 Android Studio 的 Terminal 终端执行 gradlew 报错 , 报错信息如下 :
韩曙亮
2023/03/30
5.5K0
【错误记录】在 Android Studio 的 Terminal 终端执行 gradlew 报错 ( 无法将“gradlew”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称 )
Android Sdk版本、Support包版本及常用框架最新版本汇总
Android 支持库的最新版本是28.0.0,这是最后一个google发布的支持库版本,现在google已将所有support包下的库都迁移至androidx包下面,以后的更新都只会在androidx包中进行。具体对照表点击进入。
全栈程序员站长
2022/09/02
3.3K0
再不迁移到Material Design Components 就out啦
我们最近宣布了 Material Design Components(MDC)1.1.0 ,这是一个库更新,为您的 Android 应用程序带来了 Material Theming 、新的组件、深色主题和其他令人兴奋的功能。
开发者
2020/09/24
3.8K0
再不迁移到Material Design Components 就out啦
【错误记录】Navigation 导航组件报错 ( failed to add navigation dependency )
创建完成后 , 出现如下报错信息 " failed to add navigation dependency " ;
韩曙亮
2023/10/11
8980
【错误记录】Navigation 导航组件报错 ( failed to add navigation dependency )
androidX_android targetSdkVersion
Android 9.0(API level 28)发布时,AndroidX也作为一个新的支持库发布出来了。AndroidX时Jetpack的一部分,它包含了现有的支持库和最新的Jetpack组件。
全栈程序员站长
2022/09/20
9460
androidX_android targetSdkVersion
推荐阅读
相关推荐
Android Jetpack架构组件(一)与AndroidX
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验