【解惑】Android Support 和 AndroidX

简介: 刚来这家公司时,正好赶上项目AndroidX迁移,踩了一些坑,记了些笔记,整理一下发一波~

0x1、Android Support Library的由来


Android 3.0 (API 11) 为了更好地兼容平板,加入了Fragment,而想让低版本的系统也能用上,需要做一个 向下兼容,于是Android团队推出了Android Support Library。


老Android们熟知的下述库 (v后面的数字代表 最低兼容API版本,如4对应Android 1.6) 都属于Android Support Library:


  • com.android.support:support-v4 → Android 1.6,包含Fragment、NotificationCompat等控件,包含v7和v11的基础功能,早期用到;
  • com.android.support:appcompat-v7:xx.xx → Android 2.1,增加了很多Material Design的兼容类和素材,包含v4的全部内容,用得最多;
  • support-v13 → Android 3.2,为平板开发推出的版本兼容包,Android 3.x系统是平板专用系统,用得不多;


Android版本更新飞快,现在都Android 12了,国内APP基本都最少兼容Android 5.1 (API 21),这种v4、v7的命名早已没太大的意义。


0x2、AndroidX Library的出现


从Android 9.0 (API 28) 开始,appcompat-v7:28.0.0 作为 Support Library的 终结版本,未来的新特性和改进都会进入AndroidX Library。升级内容主要有两个方面:


  • 包名 → Support Library 中的API包名都是 android.support.,而AndroidX Library中的API都变成androidx.,意味着后续android.*包下的API都是随系统发布的,而androidx.包下的API都是随着扩展库发布的,API基本不依赖于操作系统的具体版本;


  • 命名规则 → AndroidX Library 中所有的库命名规则不再包含具体的操作系统API版本号,如下面的appcompat-v7变成了appcompat库;


api 'com.android.support:appcompat-v7:28.0.0'
api 'androidx.appcompat:appcompat:1.0.0'


0x3、从Support过渡到AndroidX


一键迁移


AS 3.2及以上版本提供了一键迁移到AndroidX的功能,依次点击菜单栏的 Refactor → Migrate to AndroidX


注:一键迁移,compileSdkVersion需大于等于28,否则会提示:You need to have at least have compileSdk 28 set in your module build.gradle to refactor to androidx。


如果迁移失败,就重复下面的①②③④步进行手动迁移吧~


① 版本要求


  • Android Studio → 升级到3.2及以上;
  • Gradle插件 → 升级到4.6及以上,可在gradle/wrapper/gradle-wrapper.propertie 中修改distributionUrl指向版本号;
  • compileSdkVersion  → 升级到28及以上;
  • buildToolsVersion → 升级到28.0.2及以上;


② 迁移AndroidX配置


在项目的gradle.properties文件中添加下述配置:


# 当前项目启用androidx
android.useAndroidX=true
# 将依赖包也迁移到androidx,一般写true
# 如果设为false表不迁移依赖包到 androidx,如果有第三方依赖可能会出问题
android.enableJetifier=true


③ 修改依赖库


参照AndroidX变化中的依赖库映射改,可直接查 官方文档 或下载映射的 CSV文件,修改示例如下:


implementation com.android.support:cardview-v7
替换成→ implementation  androidx.cardview:cardview
implementation com.android.support:collections
替换成 → implementation androidx.collection:collection
implementation com.android.support:coordinatorlayout
替换成 → androidx.coordinatorlayout:coordinatorlayout


④ 依赖类重新打包


参照AndroidX变化中的类映射改,可直接查 官方文档 或下载映射的 CSV文件,修改示例如下:


import android.support.v7.app.AlertDialog    
修改成 → import androidx.appcompat.app.AlertDialog
import android.support.v7.app.AppCompatActivity
修改成 → import androidx.appcompat.app.AppCompatActivity


Tips:对了,还可能需要手动对混淆文件proguard-rules进行修改~


0x4、一些问题收集


① Support 和 AndroidX 能共存吗?


答:不可以,只能选一种。


② 执行完Migrate to AndroidX后就完成AndroidX迁移了?


答:不一定,部分报名/路径名转换可能有问题,有些还需手动调整 (xml、java、kt)


③ DataBinding中的错误(重名id错误)?


androidx中对错误的检查和处理更严格,同一个xml布局文件中存在同名id会报错。


④ attr.xml 中重复的属性名称会报错?


答:自定义控件编写自定义属性,不能与android已有属性重名,如textSize必须使用android:textSize。


⑤ Glide注解不兼容AndroidX


答:Glide升级到4.8.0以后,具体可见官方issues


⑥ 没有迁移到androidX,却出现Support库和AndroidX库冲突?


答:大概率是依赖的第三方库用到了AndroidX,可执行 gradlew :app:dependencies 查看第三方的依赖树,直接搜androidx的包。看官方从是哪个版本开始引用androidx库的,回退到之前的版本即可。另外,建议引用依赖库时使用具体的版本,而尽量避免使用latest.release或+方式。


参考文献:



相关文章
|
Android开发
IDEA编译gradle提示This version of the Android Support plugin for IntelliJ IDEA (or Android Studio) cannot open this project, please retry with version 2020.3.1 or newer.
IDEA编译gradle提示This version of the Android Support plugin for IntelliJ IDEA (or Android Studio) cannot open this project, please retry with version 2020.3.1 or newer.
896 1
|
Android开发 开发者 UED
Android Design Support Library初探-更新中
Android Design Support Library初探-更新中
98 0
|
Java Android开发 Kotlin
Android转AndroidX
公司项目多,有些事java,有些是kotlin,有些是Android,有些是AndroidX,一些依赖和依赖库的更新使得调用的方法等不同,导致功能同步时效率及极其低下,于是打算把Android项目转成AndroidX。
|
Android开发
Unrecognized Android Studio (or Android Support plugin for IntelliJ IDEA) version ‘202.7660.26.42.74
Unrecognized Android Studio (or Android Support plugin for IntelliJ IDEA) version ‘202.7660.26.42.74
342 0
Unrecognized Android Studio (or Android Support plugin for IntelliJ IDEA) version ‘202.7660.26.42.74
|
开发工具 Android开发
Android Support Design Library之FloatingActionButton(二)
Android Support Design Library之FloatingActionButton(二)
81 0
Android Support Design Library之FloatingActionButton(二)
|
Android开发
Android Support Design Library之FloatingActionButton(一)
Android Support Design Library之FloatingActionButton(一)
84 0
Android Support Design Library之FloatingActionButton(一)
|
数据安全/隐私保护 Android开发 容器
Android Support Design Library之TextInputLayout(二)
Android Support Design Library之TextInputLayout(二)
139 0
Android Support Design Library之TextInputLayout(二)
|
XML 算法 Android开发
Android Support Design Library之TextInputLayout(一)
Android Support Design Library之TextInputLayout(一)
134 0
Android Support Design Library之TextInputLayout(一)
|
Android开发
Android Support Design Library之TabLayout
Android Support Design Library之TabLayout
155 0
Android Support Design Library之TabLayout
|
XML Android开发 数据格式
Android Support Design Library之NavigationView(一)
Android Support Design Library之NavigationView(一)
130 0
Android Support Design Library之NavigationView(一)