最近看github上的项目 十有八九都已经是 androidX的了,一方面感叹之余,另一方面也想把两年的老项目升级一下,说干就干,拉一个分支,一波走起。

特别提醒,在更改 gradle.properties和app 下的gradle 后不要进行同步,直接去点refactor --> migrate to androidX,因为此时同步,会由于很多包是是android.support下的而出现各种错误

gradle.properties 配置一波
#表示当前项目启用 androidx
android.enableJetifier=true
#表示将依赖包也迁移到androidx
android.useAndroidX=true
app 下的gradle

因为随着时间的流逝,我们的compileSdkVersion 实际上是已经升级到28的,项目根目录下的classpath ‘com.android.tools.build:gradle:3.2.1’ 也已经升级到3.2.1 ,就只剩下 targetSdkVersion 还是23,那就先忽悠android studio 一波 ,先升级到28 ,再退回去。说干就干


然后就是点击 refactor --> migrate to androidX

随后就是漫长的等待

完成后,会有很多错误,我遇到到主要如下

butterknife版本太低 ,报 @UIThread 注解找不到的错误

虽然已经 是8.8.1了,但还是不满足 androidX 最低的 9.0的需求,直接去github上查了查,升级到最新的10.2.1

MotionLayout 报 app:layoutDescription 属性找不到的错误

这个问题是我们引入了 constraintlayout:2.0.0-beta3 来使用 MotionLayout 但是AS自动迁移过程中,还是会把你的版本降为稳定的 1.1.3,错误由此而生。
实现androidX的版本

implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta3'
Databinding BR.类报错误

因为项目2017年的时候使用的databinding 还有很多用了BR类 ,升级的时候没有自动识别,改掉旧的引用,直接用新的 import androidx.databinding.library.baseAdapters.BR;

DialogFragment 中获取 Dialog 错误 onDismiss错误

由于项目逐渐使用kotlin开发,突然DialogFragment 中获取的 dialog 现在有可能是 dialog?了 ,不管,直接改为 dialog!! , 还有就是 onDismiss方法 ,会给你转成如下

override fun onDismiss(dialog: DialogInterface?) {
        compositeDisposable?.clear()
        immersionBar?.destroy()
        super.onDismiss(dialog)
    }

就是DialogInterface变成了DialogInterface? 不明白是不是kotin的问题,直接改回来就好了

ClearText http 错误

改完这些跑起来,感觉见到了一丝曙光,结果各种网络请求报错,当 targetSdkVersion 改为28的时候是强制要https的访问的,我们的测试版本还是http ,不慌,直接将targetSdkVersion 改为23,一切OK。

还有一个种方法是,不修改targetSdkVersion, 在manifest中配置

android:networkSecurityConfig="@xml/network_security_config"

其中的内容如下, 就是让targetSdkVersion 版本是28的也支持非https的数据传输

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>
xml 中app:layoutManager=“android.support.v7.widget.LinearLayoutManager” 错误

有些伙伴习惯在xml中设置layoutmanager ,这个部分 AS没有自动给转,全局查找替换一下

转换为 app:layoutManager=“androidx.recyclerview.widget.LinearLayoutManager”

自定义behavior中用到 android.support.design的文件

这个也很简单,去掉前缀就可了

混淆TabLayout的坑,

如果你用了TabLayout这个控件,会发现包名变了,反射设置宽度的方法也不好使了,因为混淆排除被绕过了,按新包名加回去,随便吧androidX的一系列东西都排除掉。

## 升级完androidX 后,androidX混淆
-keep class com.google.android.material.** {*;}
-keep class androidx.** {*;}
-keep public class * extends androidx.**
-keep interface androidx.** {*;}
-dontwarn com.google.android.material.**
-dontwarn androidx.**
实体注解@Keep 的包名变了

项目按功能划分后,有些实体类被分到很细的包下,实体注解@Keep 现在也成了 这个包下了androidx.annotation.Keep。
混淆文件需要设置为

-dontskipnonpubliclibraryclassmembers
-printconfiguration
-keep, allowobfuscation @interface androidx.annotation.Keep

-keep @androidx.annotation.Keep class *{*;}
-keepclassmembers class * {
    @androidx.annotation.Keep *;
}