1. 为什么要升级AndroidX
- 概括:Jetpack是众多优秀组件的集合。是谷歌推出的一套引领Android开发者逐渐统一开发规范的架构。
- 基于生命周期感知的能力,可以减少NPE崩溃、内存泄漏、模板代码。为我们开发出健壮且高质量的程序提供强力保障。
- Jetpack组件可以单独使用,也可以搭配使用,搭配Kotlin语言特性可进一步加速开发。
- 版本28.0.0是Android Support库的最后一个版本。官方将不再发布Android support库版本。
- 长远来看。AndroidX重新设计了包结构,旨在鼓励库的小型化,支持库和架构组件包的名字进行了简化。而且这也是减轻Android生态系统碎片化的有效方式。
2. 如何在老项目中使用AndroidX
- 在项目根目录下的 gradle.properties 中添加以下字段
// 表示使用启用 androidX
// 在编译的时候,将会启用androidx的gradle task任务。
android.useAndroidX=true
// 表示将第三方库迁移到 androidx
// 即使三方库没有适配androidx,在编译阶段,会通过字节码技术修改三方库导包使之适配androidx
android.enableJetifier=true
- 项目的 compileSdkVersion,targetSdkVersion 需要统一升级到28及以上。
distributionUrl=https://services.gradle.org/distributions/gradle-4.6.1-all.zip
classpath "com.android.tools.build:gradle:3.4.1"
- 点击 Android Studio 菜单项中的 Refactor 中的 Migrate to AndroidX (android studio版本必须在3.3及以上)
- 点击 Migrate to AndroidX 之后,弹出对话框会让你选择要不要对当前项目做一个 zip 打包备份,接着点击 Migrate。
- 替换换成之后,可以看下项目 gradle 文件中的依赖,都已经被替换成了 androidx 下的依赖。
3. 升级适配常用问题解决
- 你需要执行 clean-rebuild 让编译器帮我们找出无法识别的导包,此时我们自己更新下导包即可。布局文件中的导包,全路径组件可能也需要人工修改。
- 当你把所有的导包重新替换之后,想尝试运行,你可能还会遇到别的错误如 Manifest merger failed,这是包资源冲突,由于 gradle 错综复杂的包引用关系,support 还没有移除完全,两者是不能共存的,那么按照提示,进行如下修改。
<application
......
tools:replace="android:appComponentFactory">
<activity android:name=".MainActivity">
</activity>
</application>
修改完之后,如果还不行,你需要在项目的 terminal 面板中输入如下命令,查看项目的依赖树 ./gradlew dependencies。查看是否存在 support 库的引用,然后到 github 上找到这个库的最新版本,查看是否已经有适配 AndroidX 的版本替换即可。
- CLEARTEXT not permitted by network security policy 这是由于高版本对 Http 明文请求的安全管控造成的,首先创建配置文件 res/xml/network_security_config.xml,内容如下,然后配置到 manifest 即可:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">api.devio.org/as</domain>
</domain-config>
</network-security-config>
- xml 解析失败,除了组件的包名之外,还可能是 behavior 的路径不对 像我们下面的这种情况,因为使用的是字符串而不是引用的资源,所以就没有被替换过去。因此,引用非自定义的 Behavior 的时候需要注意使用字符串资源进行引用而不是使用字符串。
- 每个项目遇到的问题可能都是不一样的,出错之后,不要着急,可以通过 ./gradlew build -- stacktrace 查看详细的出错堆栈信息,进一步排查。
PS:老项目升级是一项艰苦而有意义的任务,尽管可能会遇到各种问题,适配 AndroidX 已是大势所趋。即便升级完成,编译通过,打包成功,还是建议应该全面回归一遍功能的正确性。