为什么要迁移

Support 库版本多管理复杂,谷歌推出了 AndroidX,目前最新的 Android Support Library 是28.0.0,后面已经不会再维护了,并且新的 Jetpack库、Google Play服务、Firebase等以及一些常用的第三方库都已经迁移到 AndroidX上面了,如果项目不迁移会导致一些谷歌新功能和许多第三方库无法升级。

迁移准备

如果不在 Git 等一些源代码管理平台上,先在本地备份一份项目;如果在源代码管理平台上最好新建一个分支,在单独的分支上先迁移,这样迁移出现问题时还能重新来。

迁移

前提:先将现在的项目的支持库升级的28,这一点非常重要,因为 Support 28 和 AndroidX 1.0 是等效的二进制文件,不涉及 API 修改,所有的 API 都相同,所以只要项目本身升级到 Support28了,适配 AndroidX 就很容易了,只需要更改包名,正常是不用修改其他代码的。

手动迁移:

1、在 gradle.properties 文件中添加下面配置:

android.useAndroidX=true
android.enableJetifier=true

android.useAndroidX=true 表示Android 插件会使用对应的 AndroidX 库而非支持库;
android.enableJetifier=true Android 插件会通过重写现有第三方库的二进制文件,自动将这些库迁移为使用 AndroidX。

2、修改引用:

implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:support-compat:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
...
改为:
implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'androidx.core:core:1.0.0'
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
...

3、包名修改(包括代码里和布局里的):

android.widget.TextView
android.support.v4.content.FileProvider
android.support.design.card.MaterialCardView
android.support.v7.widget.RecyclerView
android.support.constraint.ConstraintLayout
...
改为:
androidx.appcompat.widget.AppCompatTextView
androidx.core.content.FileProvider
com.google.android.material.card.MaterialCardView
androidx.recyclerview.widget.RecyclerView
androidx.constraintlayout.widget.ConstraintLayout
...
通过Android Studio工具自动迁移:

1、使用 Android Studio 3.2 及更高版本,只需从 AS 菜单栏中依次选择 Refactor > Migrate to AndroidX,弹出弹窗点击 Migrate 按钮,下面复选框会备份项目,这样 AS 会自动将项目迁移到 AndroidX,结果跟上面手动迁移改动是一样的。

第三方库迁移:

第三方库也可以先不升级,后面再单独升级,编译的时候 Android Studio 会自动将 Support 库替换为 AndroidX 库的。

  • 第三方库不支持AndroidX,也没有关系,直接在项目中使用就可以了;
  • 第三方库支持AndroiddX,如果三方库API没有更改则非常简单,直接升级就可以了;如果第三方库是大版本升级,API改动很大就杯具了,最好先不升级,不影响项目正常运行,后面单独针对某一个库升级。

总结:

迁移 AndroidX 可以说是势在必行,因为现在一些比较活跃的第三方库基本都已经支持 AndroidX 了,如果不迁移一些第三方库我们项目根本用不了,而且我们项目迁移到 AndroidX 却可以使用其他没迁移到 AndroidX 的第三方库。

不要抗拒,开始我也很抗拒,看过很多文章但一直没动手迁移,后来是因为项目中要是使用Google的Firebase,Firebase新版本已经迁移到AndroidX,所以新版本Firebase我们使用不了,找了个老版本的也有很多问题,后面就决定支持AndroidX了,结果比我预想的顺利,我们项目规模也不小,使用 AS 的工具自动迁移的,一次就成功了,所以网上说的迁移遇到的问题,还真没遇到,不过我想迁移这么顺利,可能是因为我们项目的版本,我们项目一直都跟着Android的版本升级着,从 Android6->7->8->9,Android 10还没升级了,准备后面升级了,我们项目的Support支持库是 Android Support Library 是28.0.0,下面是我们项目迁移AndroidX前后的一些配置,特供参考:

classpath 'com.android.tools.build:gradle:3.4.0'

distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip

compileSdkVersion 28
buildToolsVersion "28.0.3"

minSdkVersion 19
targetSdkVersion 28

implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:support-compat:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'

...

迁移后的一些配置,顺便将Gradle也升级到最新了:

classpath 'com.android.tools.build:gradle:3.6.4'

distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip

compileSdkVersion 28
buildToolsVersion "28.0.3"

minSdkVersion 19
targetSdkVersion 28

androidx.appcompat.widget.AppCompatTextView
androidx.core.content.FileProvider
com.google.android.material.card.MaterialCardView
androidx.recyclerview.widget.RecyclerView
androidx.constraintlayout.widget.ConstraintLayout

...