Android Studio使用Support库而不是AndroidX

记录

最近在研究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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AndroidX是一个用于支持Android开发的开源软件库。它提供了一套新的Android支持库,用于替代旧的支持库。AndroidX的目标是提供更好的向后兼容性和更简洁的包结构。\[1\] 在使用AndroidX时,需要进行一些配置和处理。首先,在项目的gradle.properties文件中需要配置以下内容: ``` # 启用AndroidX生成支持的标志 android.useAndroidX=true # 启用Maven库转换的标志 android.enableJetifier=true ``` 这样可以确保项目使用AndroidX生成支持的库,并将旧的支持库转换为AndroidX的等效库。\[3\] 另外,在混淆文件proguard-rules中需要添加以下规则,以确保AndroidX的类和接口不被混淆: ``` -keep class com.google.android.material.** {*;} -keep class androidx.** {*;} -keep public class * extends androidx.** -keep interface androidx.** {*;} -dontwarn com.google.android.material.** -dontnote com.google.android.material.** -dontwarn androidx.** ``` 这样可以避免混淆导致的类找不到或出错的问题。\[2\] 总之,AndroidX是一个用于支持Android开发的软件库,通过配置和处理可以在Android Studio使用AndroidX来替代旧的支持库。 #### 引用[.reference_title] - *1* [Android Studio迁移到AndroidX详细教程](https://blog.csdn.net/qq_45186002/article/details/105191107)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [AndroidStudiosupport库迁移或改成Androidx](https://blog.csdn.net/qq_23849163/article/details/121400903)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Android Studio项目中使用 AndroidX支持库的相关配置说明](https://blog.csdn.net/qq_23900685/article/details/86777570)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值