最近看github上的项目 十有八九都已经是 androidX的了,一方面感叹之余,另一方面也想把两年的老项目升级一下,说干就干,拉一个分支,一波走起。
#表示当前项目启用 androidx
android.enableJetifier=true
#表示将依赖包也迁移到androidx
android.useAndroidX=true
因为随着时间的流逝,我们的compileSdkVersion 实际上是已经升级到28的,项目根目录下的classpath ‘com.android.tools.build:gradle:3.2.1’ 也已经升级到3.2.1 ,就只剩下 targetSdkVersion 还是23,那就先忽悠android studio 一波 ,先升级到28 ,再退回去。说干就干
然后就是点击 refactor --> migrate to androidX
随后就是漫长的等待
完成后,会有很多错误,我遇到到主要如下
虽然已经 是8.8.1了,但还是不满足 androidX 最低的 9.0的需求,直接去github上查了查,升级到最新的10.2.1
这个问题是我们引入了 constraintlayout:2.0.0-beta3 来使用 MotionLayout 但是AS自动迁移过程中,还是会把你的版本降为稳定的 1.1.3,错误由此而生。
实现androidX的版本
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta3'
因为项目2017年的时候使用的databinding 还有很多用了BR类 ,升级的时候没有自动识别,改掉旧的引用,直接用新的 import androidx.databinding.library.baseAdapters.BR;
由于项目逐渐使用kotlin开发,突然DialogFragment 中获取的 dialog 现在有可能是 dialog?了 ,不管,直接改为 dialog!! , 还有就是 onDismiss方法 ,会给你转成如下
override fun onDismiss(dialog: DialogInterface?) {
compositeDisposable?.clear()
immersionBar?.destroy()
super.onDismiss(dialog)
}
就是DialogInterface变成了DialogInterface? 不明白是不是kotin的问题,直接改回来就好了
改完这些跑起来,感觉见到了一丝曙光,结果各种网络请求报错,当 targetSdkVersion 改为28的时候是强制要https的访问的,我们的测试版本还是http ,不慌,直接将targetSdkVersion 改为23,一切OK。
还有一个种方法是,不修改targetSdkVersion, 在manifest中配置
android:networkSecurityConfig="@xml/network_security_config"
其中的内容如下, 就是让targetSdkVersion 版本是28的也支持非https的数据传输
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
network-security-config>
有些伙伴习惯在xml中设置layoutmanager ,这个部分 AS没有自动给转,全局查找替换一下
转换为 app:layoutManager=“androidx.recyclerview.widget.LinearLayoutManager”
这个也很简单,去掉前缀就可了
如果你用了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 现在也成了 这个包下了androidx.annotation.Keep。
混淆文件需要设置为
-dontskipnonpubliclibraryclassmembers
-printconfiguration
-keep, allowobfuscation @interface androidx.annotation.Keep
-keep @androidx.annotation.Keep class *{*;}
-keepclassmembers class * {
@androidx.annotation.Keep *;
}