使用Support库替代AndroidX

「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战

记录

最近在研究hook技术,在查找hook点的时候,难免要读到源码。在不同的sdk源码上,方法总是会有多多少少的变动。那我手里的设备是8.1的,也就是API27。把app的版本降到27,这样就可以跟27的源码了不是。结果遇到问题了。

目前我使用的Android studio版本是4.1,而从AS3.5之后,创建新项目,默认集成的support库从v7 调整为androidx了。问题来了,androidx最低可以支持的API版本是28,改成27,会报错。

背景

解决问题之前,我们先来看一下androidx是什么。
以下内容节选自我郭婶的博客,详情请去往到底什么是AndroidX?

Android系统在刚刚面世的时候,可能连它的设计者也没有想到它会如此成功,因此也不可能在一开始的时候就将它的API考虑的非常周全。随着Android系统版本不断地迭代更新,每个版本中都会加入很多新的API进去,但是新增的API在老版系统中并不存在,因此这就出现了一个向下兼容的问题。
举个例子,当Android系统发布到3.0版本的时候,突然意识到了平板电脑的重要性,因此为了让Android可以更好地兼容平板,Android团队在3.0系统(API 11)中加入了Fragment功能。但是Fragment的作用并不只局限于平板,以前的老系统中也想使用这个功能该怎么办?于是Android团队推出了一个鼎鼎大名的Android Support Library,用于提供向下兼容的功能。比如我们每个人都熟知的support-v4库,appcompat-v7库都是属于Android Support Library的,这两个库相信任何做过Android开发的人都使用过。
但是可能很多人并没有考虑过support-v4库的名字到底是什么意思,这里跟大家解释一下。4在这里指的是Android API版本号,对应的系统版本是1.6。那么support-v4的意思就是这个库中提供的API会向下兼容到Android 1.6系统。它对应的包名为android.support.v4.app。
类似地,appcompat-v7指的是将库中提供的API向下兼容至API 7,也就是Android 2.1系统。它对应的包名为android.support.v7.appcompat
可以发现,Android Support Library中提供的库,它们的包名都是以android.support.*开头的。
但是慢慢随着时间的推移,什么1.6、2.1系统早就已经被淘汰了,现在Android官方支持的最低系统版本已经是4.0.1,对应的API版本号是15。support-v4、appcompat-v7库也不再支持那么久远的系统了,但是它们的名字却一直保留了下来,虽然它们现在的实际作用已经对不上当初命名的原因了。
那么很明显,Android团队也意识到这种命名已经非常不合适了,于是对这些API的架构进行了一次重新的划分,推出了AndroidX。

简而言之,androidx是android操作系统的扩展库,我们平时开发用到的很多API都来自这个库。

解决问题,把支持库从androidx降为android.support.v7

第一步 将compileSdkVersion、targetSdkVersion改回27

在这里插入图片描述
报错Android resource linking failed,原因就是前文提过的项目中用到了androidx的库,最低支持api28。如果你这里直接改到28,就没问题了,但是我是想要27的,所以只能继续解决问题。
在这里插入图片描述

第二步,更改androidx相关依赖为support库

在这里插入图片描述
主要就是support库的替换

没更改之前
implementation 'androidx.appcompat:appcompat:1.1.0'
更改之后
implementation 'com.android.support:appcompat-v7:28.0.0'
复制代码

一堆报错,还是Android resource linking failed,原因是我们的项目里仍然有对androidx库里面资源的调用。
在这里插入图片描述
在这里插入图片描述

第三步 去除项目中对对androidx库里面资源的调用

错误调用路径,日志里都有提示,依次打开去除,比如:
G:\workspace2020\Test2\app\src\main\res\values\themes.xml:3:5
G:\workspace2020\Test2\app\src\main\res\values-night\themes.xml:3:5
打开文件发现都是红色标识,说明这些资源在support中找不到
在这里插入图片描述
将Theme.MaterialComponents.DayNight.DarkActionBar主题,替换为Support库中的存在的主题,比如Theme.AppCompat.Light.NoActionBar,剩下的爆红该删除的删除。
还有就是代码里的调用,androidx也要换成Support库
但是这时候我发现,代码显示找不到Support库
在这里插入图片描述
此时运行的话仍然显示linking failed
在这里插入图片描述
于是我打开Project Structure,看项目依赖。没错
在这里插入图片描述
但是他上面有一个All Moudules,显示的依赖,明显是有问题的
在这里插入图片描述
于是我全局搜索了下,哦,好吧,还有好多地方没改。但是重点是android.useAndroidX=true这个配置
在这里插入图片描述

第四步 去除项目中对对androidx库的配置

打开这个文件夹,可以看到两个配置。最重要的倒不是我搜到android.useAndroidx=true,而是android.enableJetifier=true这个配置。
如果你是一个新项目,使用AndroidX相关依赖,需要在gradle.properties文件里添加配置:

android.useAndroidX=true
android.enableJetifier=true
复制代码

如果你想使用AndroidX,但是之前的不迁移,可以这样配置:

android.useAndroidX=true
android.enableJetifier=false
复制代码

那我们现在并不想使用Androidx,就把这两行干掉就对了。
在这里插入图片描述
over

おすすめ

転載: juejin.im/post/7061996052601110565