AndroidX

1、AndroidX 简介 点击查看 Android 文档中对 AndroidX 的简介

按照官方文档说明 AndroidX 是对 android.support.xxx 包的整理后产物。由于之前的 support 包过于混乱,所以,Google 推出了AndroidX。

由于在后续版本中,会逐步放弃对 support 的升级和维护,所以,我们必须迁移到 AndroidX .对此,官方描述如下:

2、迁移步骤 2.1 修改当前项目的 gradle.properties android.useAndroidX=true android.enableJetifier=true 其中:

android.useAndroidX=true 表示当前项目启用 AndroidX android.enableJetifier=true 表示将依赖包也迁移到AndroidX 。如果取值为 false ,表示不迁移依赖包到AndroidX,但在使用依赖包中的内容时可能会出现问题,当然了,如果你的项目中没有使用任何三方依赖,那么,此项可以设置为 false 注意:是当前项目的 gradle.properties, 当我们切换 AS 视图到 Android 目录结构时,该文件会显示为 gradle.properties (Project Properties)。一定要注意与 gradle.properties (Global Properties) 区分

2.2 如何迁移 点击查看官方迁移指南

在 AndroidStudio 3.2 或更高版本(截图中 AndroidStudio 为 3.2 版本)中执行如下操作:

Refactor > Migrate to AndroidX

image 在执行该操作时会提醒我们是否将当前项目打包备份。如果你提前已经做好了备份,可以忽略;如果没有备份,则先备份。

3 迁移后续 3.1 手动修改错误包名 由于 Migrate to AndroidX 执行之后,部分控件的包名/路径名转换的有问题,所以还需要我们手动调整(包括修改 xml 布局文件和 .java 或 .kt 文件)。

如:ViewPager, RecyclerView 等,这些内容在迁移完成之后,包名是 androidx.core.weight.xxxx,这是一个错误的包名,我们必须手动修改,否则,无法正常编译——点击绿色 Run(运行) 按钮时会详细报出哪里有错误。(迁移到 androidX 之后,各包名可参考 支持库类映射 进行修改

此处需要注意,在 AndroidStudio 的 build 选项卡中一次最多只会报 50条错误!! 所以,可能在你修完第一批之后,后面还有N个50。此处要保持一个平静的💗。

3.2 修复 DataBinding 中的错误(重名id错误) 在 AndroidStudio3.2 + AndroidX 环境下,对错误的检查和处理更为严格。如果同一个 xml 布局文件中存在同名 id ,在之前的版本中,我们可以正常编译和运行,但是,在新的环境下, 必然会报错,错误信息如下:

在上图的错误信息中,我们以 DecibelBinding 为例,简述修复过程。

如上图,无法将xxxBinding 构造器中的xxxBinding应用到指定类型指明了出错的 Binding类 为 DecibelBinding

按照 DataBinding 类名的生成规则,我们可以知道,DecibelBinding 对应的 xml 文件名应该是 decibel.xml (如果你在 xml 中通过 class="xxxBinding" 指定了 DataBinding 的生成类名,那么就全局搜索吧)

在确定了 xml 之后,我们还需要知道到底哪里出了错误,那么,就继续看图中的 错误:找不到符号 符号:变量 xxx.这个变量就是控件的 id 名称。

DataBinding 转换控件 id 名的规则是:去除下划线连接符,然后将原下划线后面的第一个字母大写。所以,图中的 fragmentDiscoverGridItemRelativeLayout1 对应的控件id应该是:@+id/fragment_discover_grid_item_relative_layout , 后面之所以有一个 1 ,是因为重复了。然后,我们在对应的 xml 文件中搜索这个控件名,然后删除重复即可。

3.3 去除 attr.xml 中重复的属性名称 在迁移到 AndroidX 之前,我们为自定义控件编写自定义属性时,可以与 android 已有的属性重名,但是,在 AndroidX 环境下不行了,如果存在重名的情况, 必然会报错——会提示你重复定义(详细错误信息没截图,但翻译过来就是重复定义了attr/xxx)。

错误示例: <declare-styleable name="RoundImageView"> ... <!-在迁移到androidx之前,这样写虽然不规范,但是能用,不报错-> <attr name="textSize" format="Integer" /> ... </declare-styleable> 正确示例 <declare-styleable name="RoundImageView"> ... <!-迁移到androidX之后,必须使用android:xxx 属性,不能定义android已有的属性-> <attr name="android:textSize" /> ...
</declare-styleable> 关于重名属性,在 AndroidX 中不知道哪个控件中包含了一个 mode 属性,所以,如果之前你的自定义控件中有 <attr name="mode" format="xx取值类型" />,需要手动改成其他。或者通过 <attr name="android:xx属性" /> 的方式直接引用 android 中已经定义好的属性——当然了,前提是他们的取值类型一致。

3.4 Glide 中的注解不兼容AndroidX 迁移到 AndroidX 之后,Glide 中使用的 android.support.annotation.CheckResult 和 android.support.annotation.NonNull这两个注解无法迁移。之前有用户在 Glide 中提过 issue: https://github.com/bumptech/glide/issues/3185

在上述 issue 中有用户表示,将 Glide 升级到 4.8.0 之后,可以正常迁移。但是,我这边并不行。然后,我先升级了Glide ,又在 gralde 文件中增加了 support.annotation ,这样才能正常编译通过。貌似在后续 Glide 5.x 版本中会完成对 AndroidX 的完全兼容。

我的临时解决方案:

//图片加载——Glide implementation "com.github.bumptech.glide:glide:4.8.0 annotationProcessor "com.github.bumptech.glide:compiler:4.8.0

//CnPeng 2018/9/26 下午8:38 这两行是为了解决 https://github.com/bumptech/glide/issues/3185 ——Glide 中的注解还没有完全兼容androidx implementation "com.android.support:support-annotations:28.0.0-alpha3" annotationProcessor "com.android.support:support-annotations:28.0.0-alpha3"

补充: 190817 升级到 Glide 4.9.0 之后,可以正常使用 androidx 注解

具体如下:

// androidx 版本: 'androidx.appcompat:appcompat:1.0.2' // AndroidStudio 版本:3.4.2 // Gradle 插件版本:'com.android.tools.build:gradle:3.4.2'

//图片加载——Glide implementation "com.github.bumptech.glide:glide:4.9.0" implementation "com.github.bumptech.glide:okhttp3-integration:4.9.0" annotationProcessor "com.github.bumptech.glide:compiler:4.9.0" implementation 'androidx.annotation:annotation:1.1.0' annotationProcessor 'androidx.annotation:annotation:1.1.0' 3.5 规范包名(即文件夹名) 这里所说的包名,指的是项目中的文件夹名称。在之前版本中,我们命名包名时可能会出现大写字母,但起码能正常编译和运行。然而,升级到 AndroidStudio3.2 + AndroidX 环境后,可能会报错,从而导致不能正常编译和运行。

错误示例:

正确示例:

对于包的命名,好像要求并非十分严格。因为我发现,部分包含大写字母的报名在编译时会报错,部分不报错。(命名规则应该可以参考 res 目录中的命名规则)

3.6 修改未自动迁移的三方库 20181108补充: 虽然我们从 gradle 中配置了迁移三方库的参数,但是,由于三方库的版本更新问题,也可能会迁移失败。在三方库迁移失败时,如果使用了数据绑定,通常会报如下错误:

碰到上述错误之后,我们可以按下列步骤处理:

1、在 gradle 文件中,将可升级的三方库升级(通常情况下,可升级的三方库会有黄色提示) 2、如果 gradle 中可升级的库都升级之后依旧报上述错误,那么,可以新建一个项目,然后将 gradle 中的依赖库逐个拷贝到新项目中,每拷贝一个编译一次,这样可以确认是哪个三方库有问题。(实际操作时可以使用二分法的方式进行,每次拷贝一半的依赖库,然后编译)。然后就可以有针对性的处理了 3.7 莫名问题的解决 20190325 补充:

迁移过程中如果爆出一些 android 包本身或者其他莫名其妙的问题时,先去 xml 布局文件 或 .java 文件中找一下,是否有继续引用 xxx.support.xxx 的情况,如果有,记得替换成 androidx.xxx.xxx 包下的对应控件。( xxx 泛指任意内容)

在 迁移到 AndroidX 中可以查阅 support 中的组件 在 AndrodiX 的对应内容

3.8 修复项目默认启用 androidx 的情况(20190822补充) 当前 AS 版本:3.5.0

问题现象: 本地有项目已经迁移到 androidx .

然后运行其他未迁移到 androidx 的项目时,如果该项目的 gradle插件 不低于 3.4.2 ,AS 编译时会报错 can't resolve android.support.xx, 当我们打开某个引用了 support 内容的类文件时,自动导包时会提示我们导入 androidx 中对应的类。

解决方案: 切换项目到 Android 目录视图,然后找到 gralde.properties ( Global Properties ) 文件,强制 注释掉 其中的 android.enableJetifier=true 和 android.useAndroidX=true

(这个全局的 gradle.properties 文件中的 androidx 配置我也忘记是自己手误添加的还是 AS 默认启用的了,反正干掉它就妥妥的了。)

示意图如下:

禁用全局默认启用androidx.png

https://www.jianshu.com/p/41de8689615d

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