还在用android.support?该考虑迁移AndroidX了!

2023-11-15

AndroidX是Google 2018 IO 大会推出的新扩展库,主要是对Android 支持库做了重大改进。与支持库一样,AndroidX 与 Android 操作系统分开提供,并与各个 Android 版本向后兼容,可以说AndroidX就是为了替换Android支持库而设计的。

AndroidX是什么?

  • AndroidX 是 Android 团队用于在 Jetpack 中开发、测试、打包和发布库以及对其进行版本控制的开源项目。[摘自官方]
  • AndroidX完全取代了支持库,不仅提供同等的功能,而且提供了新的库。
  • AndroidX 会将原始支持库 API 软件包映射到 androidx 命名空间。只有软件包和 Maven 工件名称发生了变化;类、方法和字段名称没有改变。
  • 与支持库不同,AndroidX 软件包会单独维护和更新。androidx 软件包使用严格的语义版本控制,从版本 1.0.0 开始,可以单独更新项目中的 AndroidX 库。
  • 所有新支持库的开发工作都将在 AndroidX 库中进行,这包括维护原始支持库工件和引入新的 Jetpack 组件。

AndroidX的变化

1.常见依赖库映射

旧编译工件 AndroidX 编译工件
com.android.support.constraint:constraint-layout androidx.constraintlayout:constraintlayout:1.1.2
com.android.support:appcompat-v7 androidx.appcompat:appcompat:1.0.0
com.android.support:cardview-v7 androidx.cardview:cardview:1.0.0
com.android.support:coordinatorlayout androidx.coordinatorlayout:coordinatorlayout:1.0.0
com.android.support:design com.google.android.material:material:1.0.0-rc01
com.android.support:drawerlayout androidx.drawerlayout:drawerlayout:1.0.0
com.android.support:gridlayout-v7 androidx.gridlayout:gridlayout:1.0.0
com.android.support:media2 androidx.media2:media2:1.0.0-alpha03
com.android.support:multidex androidx.multidex:multidex:2.0.0
com.android.support:percent androidx.percentlayout:percentlayout:1.0.0
com.android.support:recyclerview-v7 androidx.recyclerview:recyclerview:1.0.0
com.android.support:support-annotations androidx.annotation:annotation:1.0.0
com.android.support:support-compat androidx.core:core:1.0.0
com.android.support:support-fragment androidx.fragment:fragment:1.0.0
com.android.support:support-v4 androidx.legacy:legacy-support-v4:1.0.0
com.android.support:viewpager androidx.viewpager:viewpager:1.0.0
com.android.support:swiperefreshlayout androidx.swiperefreshlayout:swiperefreshlayout:1.0.0

更多详细依赖库变化,可查阅官方文档或下载这些映射的 CSV 格式文件。

2.常见类映射

支持库类 AndroidX 类
android.arch.lifecycle.Lifecycle androidx.lifecycle.Lifecycle
android.support.v4.app.Fragment androidx.fragment.app.Fragment
android.support.v4.app.FragmentActivity androidx.fragment.app.FragmentActivity
android.support.v7.app.AppCompatActivity androidx.appcompat.app.AppCompatActivity
android.support.v7.app.ActionBar androidx.appcompat.app.ActionBar
android.support.v7.widget.RecyclerView androidx.recyclerview.widget.RecyclerView
android.support.design.card.MaterialCardView com.google.android.material.card.MaterialCardView
android.support.design.ripple.RippleUtils com.google.android.material.ripple.RippleUtils
android.support.design.widget.CoordinatorLayout androidx.coordinatorlayout.widget.CoordinatorLayout
android.support.design.widget.NavigationView com.google.android.material.navigation.NavigationView
android.support.percent.PercentFrameLayout androidx.percentlayout.widget.PercentFrameLayout

更多详细支持类映射变化,可查阅官方文档或下载这些映射的 CSV 格式文件。

为什么要迁移AndroidX?

下面是Google官方描述

Existing packages, such as the Android Support Library, are being refactored into AndroidX.
Although Support Library versions 27 and lower are still available on Google Maven,
all new development will be included in only AndroidX versions 1.0.0 and higher.
  • 大致意思是:现有的软件包,如Android支持库,正在被重构为Androidx。尽管在Google Maven上仍然提供支持库版本27及更低版本,但所有新开发将只包含在Androidx 1.0.0及更高版本中。

AndroidX迁移步骤?

1.更新Android Studio与Gradle版本

  • 将Android studio升级到 3.2及以上;
  • Gradle 插件版本改为4.6及以上;
  • compileSdkVersion 版本升级到 28及以上;
  • buildToolsVersion 版本改为 28.0.2及以上。

2.迁移AndroidX配置

  • 在项目的gradle.properties文件里添加如下配置:
android.useAndroidX=true
android.enableJetifier=true
配置 说明
android.useAndroidX=true 表示当前项目启用 androidx
android.enableJetifier=true 表示将依赖包也迁移到androidx

备注:enableJetifier如果取值为false,表示不迁移依赖包到androidx,但在使用依赖包中的内容时可能会出现问题,当然了,如果你的项目中没有使用任何三方依赖,那么,此项可以设置为false。

3.修改依赖库
修改项目app目录下的build.gradle依赖库,具体可以参照AndroidX变化中的依赖库映射。

修改前 修改后
implementation ‘com.android.support:appcompat-v7:28.0.2’ implementation ‘androidx.appcompat:appcompat:1.0.0’
implementation ‘com.android.support:design:28.0.2’ implementation ‘com.google.android.material:material:1.0.0’
implementation ‘com.android.support.constraint:constraint-layout:1.1.2’ implementation ‘androidx.constraintlayout:constraintlayout:1.1.2’

4.依赖类重新导包
将原来import的android.**包删除,重新import新的androidx.**包

import android.support.v7.app.AppCompatActivity; → import androidx.appcompat.app.AppCompatActivity;

5.一键迁移AndroidX库
AS 3.2 及以上版本提供了更加方便快捷的方法一键迁移到 AndroidX。选择菜单上的ReFactor —— Migrate to AndroidX… 即可。(如果迁移失败,就需要重复上面1,2,3,4步手动去修改迁移)

备注:如果你的项目compileSdkVersion 低于28,点击Refactor to AndroidX…会提示:

Q&A

  • 同一个项目中Android Support和AndroidX可以共存吗?
不可以共存。需要将依赖修改为Android Suppor或AndroidX中任一种。
  • 执行Migrate to AndroidX之后就完成AndroidX迁移了?
不一定。部分控件的包名/路径名转换的有问题,所以还需要我们手动调整(包括修改xml布局文件和.java/.kt 文件)。
  • DataBinding中的错误(重名id错误)?
在 AndroidStudio3.2 + androidx 环境下,对错误的检查和处理更为严格。如果同一个xml布局文件中存在同名id,
在之前的版本中,我们可以正常编译和运行,但是,在新的环境下, 必然会报错,错误信息如下:

  • 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>
  • 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的完全兼容。

  • 规范包名(即文件夹名)?
    这里所说的包名,指的是项目中的文件夹名称。在之前版本中,我们命名包名时可能会出现大写字母,虽然这并不符合Java命名规范,但起码能正常编译和运行。然而,升级到 AndroidStudio3.2 + androidX 环境后,必须严格遵守命名规范,否则,可能报错,从而导致不能正常编译和运行。

参考:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

还在用android.support?该考虑迁移AndroidX了! 的相关文章

  • WSL2开启后Vmware虚拟机性能下降

    开启WSL2 需要开启 虚拟机平台 功能 实际就是HyperV 开启后 Vmware虚拟机里面性能下降大约10 再次断绝了我的WSL2直接挂在ext分区的念想 见图 开启前 CPU Z跑分464 开启后414 按照Vmware建议关闭侧信道
  • C++学习(六十六)IoT和AIoT

    loT是物联网的英文名称 是Internet of Things的缩写 AloT AI IoT 是人工智能 物联网的英文名称 智能物联网
  • 修复ROS2使用zsh无法用tab补全 ros2 指令的相关问题

    安装完ROS2 后 改用zsh发现无法使用tab补全 ros2相关指令 现记录下修复办法 首先 安装python3 argcomplete sudo apt install python3 argcomplete 然后 在 zshrc里面添
  • STM32 CAN通信的学习笔记总结(从小白开始)

    知识来源于互联网 回馈于互联网 目录 1 总体概述 1 1 基本概念 1 2 通讯方式 1 3 为什么使用CAN 1 4 CAN的协议及组成 2 上帝视角看CAN的通讯过程 2 1 数据传输原理实现 2 2 通信的整个过程 2 2 1 空闲
  • Python读写excel文件

    1 使用pandas库读取Excel 最常用 pandas可以读取各种各样格式的数据文件 一般输出dataframe格式 如 txt csv excel json 剪切板 数据库 html hdf parquet pickled文件 sas
  • FSCapture注册码

    企业版序列号 name bluman serial 序列号 注册码 VPISCJULXUFGDDXYAUYF 转载于 https www cnblogs com wshsdlau p 4396184 html
  • HTML<DIV>常用标签

    目录 1 什么是DIV 1 1 div是什么意思 1 2 div标签怎么用 1 3 div布局优势 1 4 DIV作用是什么 1 5 有哪些DIV方式 1 5 1行内样式 1 5 2内嵌样式 1 5 3外部样式 1 6 样式使用规则 2 D
  • 使用队列实现stack

    两个队列实现一个stack q1只保持一个元素即可 多余的转换到q2当中 出队列元素 有两种情况 q1不为空 直接出队列 如果连续出队列 q1可能为空 需要q2的部分元素放到q1当中去 说白了就是元素捣鼓来捣鼓去的问题即可 class My
  • Linux-安装redis6.2.1及主备复制模式(replication)

    Linux 安装redis6 2 1 下载redis6 2 1资源 上传至安装目录 解压及编译 解压 修改名称 编译 修改配置文件 主节点 从节点 启动及测试 启动 主节点 从节点 测试 下载redis6 2 1资源 地址 https re
  • 华为数通方向HCIP-DataCom H12-821题库(单选题:101-120)

    第101题 可用于多种路由协议 由 if match 和 apply 子句组成的路由选择工具是 A route policy B IP Prefix C commnityfilter D as path filter 答案 A 解析 Rou
  • QT对话框去掉帮助和关闭按钮 拦截QT关闭窗口的CloseEvent

    建了一个对话框 我不想把边框去掉 只想去掉关闭按钮 setWindowFlags windowFlags Qt WindowCloseButtonHint Qt WindowContextHelpButtonHint 结果那个问号的按钮去掉
  • c++序列化以及反序列化实现

    1 什么是序列化和反序列化 当我们在写程序时 比如说我们自定义了一个实体类Person 然后在程序中创建一个该实体类对象 并给对象赋了一些值 但是我们想将这些数据发给我们的其他的程序员朋友 让他们也可以调用我们创建的这个实体类并使用我们的数
  • 数据库实时同步利器——CDC(变化数据捕获技术)

    在进行数据ETL过程中 我们经常需要通过周期性的定时调度将业务数据按照T 1的方式同步到数据仓库中 进行数据分析处理 最终通过BI报表展示给最终用户 但这种方式实时性较差 用户往往只能看到昨天的数据 会影响用户决策的及时性 而如果用户要近实
  • 更换持续集成工具,从 Travis 到 Github Actions

    我真傻 真的 单单受文档的推荐就选择了 Travis 作为部分项目的持续集成工具 没有料到它早已于 2020 年 12 月更换了免费政策 不再为开源项目提供免费的用于持续集成使用的 Credits 了 当赠送的 10000 个点数用完 就需
  • 【踩坑经历】Java Long 类型传给前端损失精度的问题

    最近在做一个 SpringBoot Vue 的项目 持久层框架用的是 MyBatis Plus 然后遇到了一个问题 一起来看下怎么回事 这个项目就是一个文章收藏器 可以收藏一些技术文章 然后可以选择星标 以便查找这篇文章 那么点击星标的按钮
  • 服务器的tomcat调优和jvm调化

    下面讲述的是tomcat的优化 及jvm的优化 Tomcat 的缺省配置是不能稳定长期运行的 也就是不适合生产环境 它会死机 让你不断重新启动 甚至在午夜时分唤醒你 对于操作系统优化来说 是尽可能的增大可使用的内存容量 提高CPU 的频率
  • 操作系统12----进程间通信IPC

    进程间通信IPC 1 进程通信 IPC Inter Process Communication 1 1直接通信 1 2间接通信 1 3阻塞通信 1 4非阻塞通信 2 信号 Signal 3 管道 pipe 4 消息队列 5 共享内存 1 进
  • 基于面板数据的熵值法介绍与实现

    熵值法是一种基于信息熵理论的客观赋值方法 即数据越离散 所含信息量越多 对综合评价影响越大 目录 一 基于面板数据熵值法介绍 二 R语言实现 参考文献 一 基于面板数据熵值法介绍 传统的熵值法有个弊端 只能针对于截面数据 即根据某一年 k
  • MySQL创建表时提示:1067 - Invalid default value for ‘sex‘

    问题 在创建表的时候如果有中文 则会提示 1067 Invalid default value for sex 比如 创建信息表 create table userInfo card id int primary key auto incr

随机推荐

  • unity 内嵌网页简单流程(3D WebView 3.14.1)

    我是用于 web 平台 特此记录 3D WebView 主要实现在unity 中制作网页浏览器 可使用平台 很强大 其他类似插件都有平台缺陷 Android iOS UWP Hololens Windows macOS WebGL 0 插件
  • 制造行业主数据同步集成

    主数据是描述企业核心业务实体的数据 是企业核心业务的主要构成 各个订单 合同以及业务的主体 在企业内部被重复 共享应用的数据 主数据跨越企业各个业务部门以及各类业务系统 是应用系统间数据交互的基础 近期一直北方某制造业进行主数据治理工作 谈
  • React Router源码解析

    虽然React Router已经到了V6版本了 但在我们项目中 目前主要用的还是React Router的V5版本 所以此处我们从V5版本着手 去了解前端路由的实现原理 目标 希望收获 前端路由的基本原理 React Router 的实现原
  • Scanner的.next()以及.nextLine()各自代表什么意思

    String str new Scanner System in nextLine String str new Scanner System in next next 方法一次读取一个无间隔子串 比如 TAB 空格 回车符 的时候 会终止
  • Chromium OS 初体验

    Chromium OS可是早有耳闻 但是一直没有尝试 最近很多评论甚至认为会对Windows和Mac都能够造成压力 于是迫不及待的想尝试一下了 百度下了官网 官网很贴心 不光给了用于写入U盘的镜像文件 最初是针对上网本的 所以自然不是刻录成
  • Python 基础知识6 字典

    字典 定义字典 d key1 22 key2 meng print d print type d 访问字典里的值 dict Name Runoob Age 7 Class First print dict Name dict Name pr
  • 在Unity中编写单元测试

    最近在我忙于我的最新项目时 我一直在思考 我如何能单元测试代码 我知道如果我先把它搁一边 在编写一大段游戏代码后 我可能再也不会回头来写测试了 编写单元测试对我有两个挑战 首先 游戏不同于其他类型的软件 没有好的代码分段来处理好输入 以及图
  • Hello World

    编写思路 创建 Java 源文件 将源文件编译为 class 文件 运行 class 文件 编写代码 代码块 我的第一个 Java 程序 class 类 Java 程序基本组成单位 HelloWorld 为类的名称 public class
  • 企业微信自建内部应用Demo源码,附在线Demo及视频讲解,创建测试公司及测试应用简单配置即可使用

    自建内部应用Demo源码 前端vite vuejs https github com liyuexi qywx vuejs qywx vuejs 企业微信自建内部应用demo源码前端vite vuejs https github com l
  • 最简单的实现[三栏布局中间自适应]方法

    一 float margin 左盒子 左浮动 右盒子 右浮动 中间盒子 左右加margin 注意 盒子的书写顺序是左右中 div class container div class left w div div class right w
  • docker 安装 nginx1.23.2

    注意 nginx 不能提前挂载配置 html 目录可以提前挂载 但提前挂载了访问默认nginx页面就没有了 部署前端时可提前挂载 所以我们先提前创建副本 1 提前创建挂载文件 创建容器副本 主要作用与获取配置文件 先创建一个没有的nginx
  • 错误隐藏学习手记(五)

    在H 264的研究中 我们可以看到目前有三种开源编码 很多测试都是在一个开源编码中实现的 这个开源编码就叫做 JM86 在这里呢具体介绍一下这三种开源编码 一 三大开源编码器介绍 1 JM H 264的官方测试源码 由德国hhi研究所负责开
  • oracle提高数据移植速度.

    author skatetime 2008 07 21 提高数据移植速度 序列也能影响数据迁移的速度 1 测试表 test skate1 SQL gt select count from test skate1 COUNT 5841920
  • python-kafka多线程快速读取consumer消费者数据,同时使用批读取与无限流读取改进

    python单线程循环读取consumer会很浪费时间 而且速率远远低于生产者可容纳的速率 因此我们使用多线程来处理IO密集型的读取操作 文章目录 极简的示例 1 生产者 先运行 2 消费者部分多线程读取 消费者改进 1 批次读取 并将读取
  • StringBuilder详解

    1 简介 StringBuilder和StringBuffer一样 都是继承自抽象类AbstractStringBuilder类 也是一个可变的字符序列 StringBuilder和StringBuffer非常相似 甚至有互相兼容的API
  • 【蜂群课堂】懒人精灵PP-PicoDet课程

    一 目标检测介绍 PP PicoDet 是百度提出的移动端友好和高精度Anchor Free 目标检测算法 实测性能非常优越 优点 识别速度更快 轻量级模型 更适合移动端设备运行 cpu占用低 更能稳定运行 可以断点恢复训练 缺点 训练数据
  • Qt在windows与Mac OS中获取执行程序版本号

    1 windows中获取执行文件exe的版本号 QString GetFileVertion QString aFullName QString vRetVersion string vFullName QStringToString aF
  • Java对象和类

    Java对象和类 Java是一种面向对象的编程语言 通过使用类和对象来组织和管理代码 在本教程中 我们将探讨Java中对象和类的使用 以及如何创建和使用它们 步骤1 创建一个类 Java中的类是对象的模板 用于定义对象的属性和行为 我们首先
  • 解决There is no getter for property named ‘orgld‘ in ‘class java.lang.Long“问题

    问题描述 添加一个根据orgId返回信息时候 后端报There is no getter for property named orgld in class java lang Long 的错误 解决问题 最后发现出错地方在Mapper层
  • 还在用android.support?该考虑迁移AndroidX了!

    AndroidX是Google 2018 IO 大会推出的新扩展库 主要是对Android 支持库做了重大改进 与支持库一样 AndroidX 与 Android 操作系统分开提供 并与各个 Android 版本向后兼容 可以说Androi