AndroidX 迁移


title: androidx迁移
date: 2019-10-15 11:49:20
tags: Androidx


Androidx 迁移总结

一、什么是androidx

背景

随着android版本的不断迭代更新,每个版本中都会有新的API加入,但是新加入的API在老的版本里并不存在,因此就出现了向下兼容的问题。于是android团队就退出了大名鼎鼎的支持库Android Support Library,用于提供向下兼容的功能。比如我们每个人都熟知的support-v4、suport-v7都是属于Android Support Library

随着支持库版本的迭代,从最初的android Support v4到后来的v7、v13,以及在这其中又对支持库的内部拆分,使得支持库变得庞大而复杂。同时,支持库具体版本的最低支持的系统版本也在发生着变化,比如android Support v4,最初的命名含义就是最低支持API 4,但是到后来最低支持9、14等。含义的变化使得开发者在引入的时候不得不慎重核实。

且支持库为了更好地利用Android系统自身的一些新特性,每个版本的支持库内部又针对不同的编译版本,划分出了对各支持库细分版本。后来,开发者引入时,需要引入与当前项目编译版本对应的,且满足当前项目最低支持构建版本的具体支持库版本。比如常见的写法:

//支持库
            support_support_annotations       : "com.android.support:support-annotations:$versions.support",
            support_appcompat_v7              : "com.android.support:appcompat-v7:$versions.support",
            support_recyclerview_v7           : "com.android.support:recyclerview-v7:$versions.support",
            support_cardview_v7               : "com.android.support:cardview-v7:$versions.support",
            support_design                    : "com.android.support:design:$versions.support",
            support_support_v4                : "com.android.support:support-v4:$versions.support",
            support_support_core_utils        : "com.android.support:support-core-utils:$versions.support",

其中versions.support需要与项目编译版本保持一致,至少需要在大的Api Level上保持一致。

由于支持库过于混乱,最终导致的问题就是,开发者不方便使用,官方维护也困难。所以需要对支持库做一次统一的梳理。

androidx华丽登场

Android 官方于2018年Google I/O 大会发布了AndroidX。

AndroidX对原始的Android支持库做了重大的改进。AndroidX完全取代了支持库,不仅提供同等的功能,而且提供了新的库。而且AndroidX还包括以下功能:

  • AndroidX 中的所有软件包都使用一致的命名空间,以字符串 "androidx." 开头(除了 Design 库被迁移到 Android 的 Material Components)。有关所有旧类到新类以及旧编译工件到新编译工件的完整映射,请参阅软件包重构页面。

  • 与支持库不同,AndroidX 对各个Libray分开设立单独的版本管理,并且都严格遵守语义版本控制

  • 所有支持库新的API都在AndroidX中更新,包括原始支持库工件和引入新的 Jetpack 组件。

由于各个单独Library的独立版本管理,开发者就可以精确指定需要依赖的library,避免不必要的导入,从而减小代码体积。并且开发者在引入时,只需要关注AndroidX中具体的需要引入的构件版本即可。且大部分具体的构件,具有一致的版本号。开发者使用起来不再需要关注项目自身的最低支持版本和编译版本了,只需要像引入其他的第三方库一样,v1.0、v2.0、v3.0这种方式引入即可。

如原有的引入写法

com.android.support:recyclerview-v7:28.0.0

变成了

androidx.recyclerview:recyclerview:1.0.0

二、为什么迁移

AndroidX相较于原始支持库更友好,同时,官方文档明确表示原始支持库后续将不再维护。另外,在Android Studio新建模块时,如果没有迁移到AndroidX,模块是创建不了的。


image

新建项目时也是默认使用androidX库,并且是无法取消的。


image

说明官方已经开始强制开发者迁移到AndroidX.

而且,主流的第三方库如butterknifeglide等都已适配AndroidX。如果要用使用它们的新特性,迁移到androidX也是前提。

三、怎么迁移

前提准备

  • Android Studio 3.2及以上。当前时点最新版本已经是3.5.1稳定版了。
  • AGP版本3.2.0及以上,对应的Gradle版本4.6及以上。
  • 项目编译版本28及以上。

注意: 最好在一个版本可控的分支进行迁移,因为涉及到变动的类或文件会非常多,避免合并代码时冲突。
同时,分离出没次变更,以便于分析定位问题。

迁移过程

Android官方提供了具体的迁移文档:
https://developer.android.com/jetpack/androidx/migrate

Android Studio一键迁移

Android Studio 3.2 及以上版本提供了更加方便快捷的方法一键迁移到 AndroidX,Refactor > Migrate to AndroidX:

image

然而,一键迁移并不是万能的,有些库还是无法很好识别并迁移,还是需要手动迁移。

四、遇到的问题

1. 部分库不会自动替换,需要手动替换

design库,因为并不是以androidx.开头,并没有自动替换掉,比如:

android.support.design.widget.AppBarLayout
替换成
com.google.android.material.appbar.AppBarLayout

coordinatorlayout库
如:

android.support.design.widget.CoordinatorLayout 
替换成
androidx.coordinatorlayout.widget.CoordinatorLayout

布局文件
部分布局文件还是需要手动进行替换。

比较保险的解决方案:
全局搜索android.support,然后一个一个找(任意文件),然后在官方迁移文档找到原先支持库对应的AndroidX库,进行替换。

注意::如果项目中用到FilProvider,会搜索到android.support.FILE_PROVIDER_PATHS,这个是不用改的。参考资料

2. Glide中使用的 android.support.annotation.CheckResultandroid.support.annotation.NonNull这两个注解无法迁移

查看Glide仓库发现有人提过issue:https://github.com/bumptech/glide/issues/3185

解决:
升级Glide版本到4.8.0或更高,问题解决。

3. Butterknife依赖编译无法通过。

解决:
由于Butterknife中用到android.support.v4.content包,而在AndroidX中找不到了所以报错。

image

解决: 升级Butterknife到10.0.0或更高版本,问题解决。

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

推荐阅读更多精彩内容