[译]迁移到AndroidX:提示,技巧和引导

原文:https://medium.com/androiddevelopers/migrating-to-androidx-tip-tricks-and-guidance-88d5de238876
Jetpack是一组可以帮助你更容易写出高质量apps的库,工具和引导。Jetpack通过最佳实践,限制样板代码,并简化负责的任务,让编码变得更容易。让你专注于你的业务代码。
AndroidX是Jetpack中所有的库的软件包名称。可以将AndroidX视为用于开发,测试,版本化和发布JetPack库的开源项目。
在I/O 2018上,我们就宣布将support库重构为AndroidX命名空间,目前重构工作已经通过Support Library 28的完结和AndroidX 1.0的发布完成。

为什么要做这样的迁移?

现在已经是时候迁移从Android Support Library 到AndroidX上。这里有以下四点原因:

  1. Android Support Library已经完成了它的任务了。28.0是Android Support命名空间的最后一个发布版本了,同时Android Support 这个命名空间在不久只会将不在进行维护。所以,如果你想你在Support Library中的bug得到修复或者使用新的功能,你就需要迁移到AndroidX上。
  2. 更好的包管理。使用AndroidX,可以让你得到标准化和独立的版本控制,以及更标准化的命名和更频繁的发布。
  3. 很多库已经迁移到了AndroidX上了,比如Google Play Services,Firebase,Butterknife,Mockito 2和SQLDelight等。
  4. 所有新发布的Jetpack库都将使用AndroidX命名空间,所以如果你想使用例如Jetpack Compose或者CameraX这样到新功能,你就需要迁移到AndroidX上。

迁移准备

在你迁移你到代码到AndroidX上之前,你需要做这些事情:

  • 备份你到项目,如果你有使用版本管理工具,你只需要将你到代码提交备份就好,因为迁移可能会修改你项目中到不少文件,如果你不想丢失你到代码的话。
  • 你可以创建一个新的分支去进行迁移工作,等迁移完成后再进行分支合并。
  • 如果可以的话,在你的迁移过程中,尽量暂停功能的开发或者最小化的开发(至少不要在迁移过程中进行重构或者引入新的功能),这样能减少你代码合并时可能发生的合并冲突。

开始迁移

在迁移过程中,重点在于解决发生的错误,使你的项目能编译通过并且通过所有测试。

Step 1:更新所有的Support Library版本到28

我们不推荐你直接从旧版本的Support Library(比如26或27)迁移到AndroidX,因为这样你不仅面对命名空间修改的问题,你还有可能面临因为新库与旧库API改变导致的错误问题。
所以,我推荐你先将Support Library 更新到28,解决了所有API更改到问题,确保你到项目能在28版本的Support Library下编译通过并通过所有测试。
Support Library28和AndroidX 1.0是等效的二进制文件,意思是两者只是包命名空间的不同:所有的APIs都是一样的。这就意味着,你从Support Library28迁移到AndroidX,你几乎不需要修改什么。

Step 2:启用Jetifier

Jetifier用来帮助迁移你引用的第三方依赖库使用AndroidX。Jetifier将会改变这些第三方依赖库的字节码,让它们能与使用AndroidX的项目兼容。
在项目中启用Jetifier,只需要将下面的代码添加到你的gradle.properties文件中即可:

android.useAndroidX=true
android.enableJetifier=true

现在,当代码自动导入库的时候,将会导入该库到AndroidX版本,而不是旧到Support Library。

Step 3.更新dependencies(依赖)

在开始迁移之前,你应该将你引用的第三方库更新到该库到最新版本,否则可能会导致编译不通过。
如果你使用的是会自动生成代码的库,Jetifier将不会对其进行修改。因此,你需要检查你的代码生成库是否与AndroidX兼容。
如果你想要直接跳过步骤2和步骤3,则可能会遇到一些错误:

  • 如果你使用的第三方库的代码与AndroidX不兼容。在这种情况下,跟下面堆栈类似的堆栈跟踪将想你说明,它正在尝试获取旧版本的Support Library:
…
Error : Program type already present: android.support.v4.app.INotificationSideChannel$Stub$Proxy |
Reason: Program type already present: android.support.v4.app.INotificationSideChannel$Stub$Proxy
…
  • 如果你的项目只进行了部分的迁移,则可能会遇到重复类的错误,因为它试图从Support Library和AndroidX中提取相同的代码。堆栈跟踪将可能显示以下内容:
…
Duplicate class android.support.v4.app.INotificationSideChannel found in modules classes.jar (androidx.core:core:1.0.0) and classes.jar (com.android.support:support-compat:28.0.0)
…

Step 4:更新你的源码

你有三个方案可以来更新你的源码来使用AndroidX:

  • Android Studio
  • 手动更新
  • Bash脚本
    如果你使用的Android Studio版本是3.2以上的。你可以通过使用Refactor功能菜单里的Migrate to AndroidX选项去更新你的代码。这是最推荐你的方案,因为Android Studio 可以在重构时检查你的源码并做出正确的决定。
    image.png

    如果你不是使用Android Studio开发或者你的项目结构太复杂导致使用Migrate to AndroidX选项无法涵盖。则可以利用类映射csv文件来实现查找和替换bash脚本进行替换。这个脚本应该做到能找到有android.support类的所有源码实例,然后将它们替换称同等功能的AndroidX。
    具体来说,就是脚本要使用类映射的CSV文件用grep命令和sed命令来替换程序包名。但是,这是一种非常暴力的迁移方法,这种方法可能无法充分和正确的找到和替换所有代码。
    除此之外,更新也可以通过纯手动的方式一点点解决。
    如果你决定使用手动更新的方法,你可以访问迁移到AndroidX页面,你可以在这里找到详细关于Support Library和AndroidX对应的映射关系。
    你也可以将这个CSV文件下载下来。
    到这里,你应该就可以让你的项目可以使用AndroidX并能编译通过。

那些令人讨厌的意外

尽管我们在这里讨论的工具和流程应该能引导大多数项目进行顺利的迁移,但是我们发现在某些情况下,你可能需要手动进行修改。

版本配置文件

你需要手动重新定义库版本的变量。这里说明以下,在迁移之前,你的build.gradle文件可能是这样的:

ext.versions = [
    ‘drawer’ : ‘28.0.0’,
    ‘rview’ : ‘28.0.0’
]
implementation “com.android.support:drawerlayout:${versions.drawer}”
implementation “com.android.support:recyclerview-v7:${versions.rview}”

在使用迁移工具完成迁移只会,你的代码可能变成这个样子:

ext.versions = [
    ‘drawer’ : ‘28.0.0’,
    ‘rview’ : ‘28.0.0’
]
implementation “androidx.drawerlayout:drawerlayout:1.0.0”
implementation “androidx.recyclerview:recyclerview:1.0.0”

你看DrawerLayout和RecyclerView使用的是AndroidX的包,但是版本号并没有使用到版本号变量,所以,你需要对其进行手动修改:

ext.versions = [
    ‘drawer’ : ‘1.0.0’,
    ‘rview’ : ‘1.0.0’
]
implementation “androidx.drawerlayout:drawerlayout:${versions.drawer}”
implementation “androidx.recyclerview:recyclerview:${versions.rview}”

混淆配置和构建脚本

迁移工具并不会自动更新我们的混淆文件和任何相关的内置脚本。因此,如果你有使用到这些文件,并且里面包含来Support Library包名称,你需要手动进行修改。

获取最新的稳定版本

迁移工具提取最新版本的AndroidX库。结果可能导致你使用到的某些库是Alpha版本,比如迁移之前,Support Library可能是:

implementation ‘com.android.support:appcompat-v7:28.0.0’

迁移之后,你可能使用的是Android对应的alpha版本的库:

implementation ‘androidx.appcompat:appcompat:1.1.0-alpha01’

所以,如果你希望使用稳定版本的库,你需要手动去更新以下版本:

implementation ‘androidx.appcompat:appcompat:1.0.2’

更多帮助和资源

你可以在迁移到AndroidX这个界面找到相关的教程,工具和可能遇到问题等更多信息。这个页面包含了AndroidX项目的概述,迁移指南,旧的Support Library库和新的稳定版或者alpha版的AndroidX的映射表以及你编写迁移脚本需要到的CSV文件。
在这里也有一篇文章详细介绍了在Plaid示例项目中向AndroidX的迁移
最后,这里有一个问题跟踪器,你可以在其中可以看到Android团队正在处理的迁移工具的问题。当然你也可以使用页面左上方的按钮告诉我们在迁移工具中发现的任何问题。

最后的思考

如果你还没升级到AndroidX,那么现在就是一个不错的时机,你可以利用Jetpack库来为你的项目简化开发复杂度。通过本文的引导,你会发现在大多数情况下,迁移是一件很简单的事情。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容