2018 年 I/O 大会后,Google 宣布将 Support Lib 重构为 AndroidX 的计划,随后便在 Support Lib 28 上进行了重构。然而因为后续不会在 Support Lib 上修复 bug 或者发布新功能,而且 Support Lib 和 AndroidX Lib 在项目中会互相冲突,所以我们不可避免的要进行 AndroidX 迁移。此篇文章就是笔者进行 AndroidX 迁移时的步骤和踩过的坑,希望可以帮到你。
新建分支或者备份项目
因为 AndroidX 的迁移会导致大量文件的修改,所以笔者建议备份项目,或者使用 Git 等工具,在单独的分支进行迁移,以免出问题后影响较大。
升级 Support Lib 至 28
因为 Support Lib 版本需要与 compileSdkVersion 大版本一致,所以我们需要先将 compileSdkVersion 修改为 28,为什么要升级到 28 呢?因为 Support Lib 28 与 AndroidX 只有命名空间不同,提前升级到 28 可以使后续修改最少:
compileSdkVersion : 28
然后将所有 Support Lib 的版本修改为大版本为 28 的可用版本:
// 以 v7 为例,修改大版本到 28implementation 'com.android.support:appcompat-v7:27.0.0'// 修改后implementation 'com.android.support:appcompat-v7:28.0.0'
并且保证编译通过进行下一步。
开启 Jetifier
在 gradle.properties 文件中加入以下开关:
android.useAndroidX = trueandroid.enableJetifier = true
将 Support 依赖改为 AndroidX
Android Studio 3.2 稳定版已经提供了迁移功能,建议升级到 Android Studio 3.2 及后续版本。在 Android Studio 中选择 Refactor -> Migrate to AndroidX:
点击 Migrate,等待并进行下一步。
解决依赖冲突
一般来说,进行 AndroidX 迁移时,都会发生依赖冲突,这里笔者的解决办法是:
将所有 build.gradle 中的依赖都升级到建议版本:
// 如上图示例,我们将 firebase 从 16.0.3 升级到 17.4.4api 'com.google.firebase:firebase-core:17.4.4'
这样做完所有依赖升级的话可以将依赖冲突降到最小,当然我们还是会遇到依赖冲突
如果发生依赖冲突,查看 build 日志,看是哪个库的哪两个版本发生了冲突。发生冲突一般有两种情况,一是两个地方依赖了两个不同版本,这种情况随便删除一出就是。二是依赖了 A 和 B,但是 A 里面包含了不同版本的 B,这种情况要不然删除依赖 B,要不然将 B 的版本改为 A 中一致。
替换不可用包名
我们在做上述迁移步骤时,Android Studio 会将我们把所有 support 包的导入改为 androidx 包的导入,但是它并不是完全智能的, 如下图:
Android Studio 自动替换的包名为 androidx.core.app.DialogFragment,但其实在 AndroidX 中,DialogFragment 在 androidx.fragment.app 包下,为了避免重复工作,我们使用全局替换 androidx.core.app.DialogFragment 为 androidx.fragment.app.DialogFragment:
需要注意的是我们做全局替换时,一定要注意不要替换错,要不然当你做了多次全局替换时,发现其中有一次替换错误就比较难搞了。当然对于很多 build 所生成的文件(如 Databbinding 、ARouter、Dagger2 等)就不需要做全局替换了,直接 clean,然后在 build,以减轻工作量。
还有需要注意的是,如 DataBinding 一直报错,且 clean 不起作用时,可能是原文件中有错,导致 build 生成的文件有错,而 Databinding 直接进行 View 响应时不需要在 Java 文件中进行声明 View,所以 Android Studio 可能不会直接提示 xml 文件报错,我们就可以直接找到对应的布局文件,然后导入正确的文件并进行全局替换。
直到替换掉所有 xml 和 Java/Kotlin 文件中的错误 import,并且编译通过。
添加新的混淆配置
当我们使用了 AndroidX 时,如果我们的项目是需要混淆的,那我们需要添加新的混淆配置:
-keep class androidx.** {*;}-keep interface androidx.** {*;}-keep public class * extends androidx.**-keep class com.google.android.material.** {*;}-dontwarn androidx.**-dontwarn com.google.android.material.**-dontnote com.google.android.material.**
好了,AndroidX 的迁移步骤就是这些了。喜欢的话点个赞吧,也可以扫描关注哟。
扫描关注哟
----- DoubleThought -----