我们的应用还在android 13 版本,决定把工程升级到15 ,结果发现很多东西要修改,下面是升级的过程记录。
# 1. 现状
android api 33
jdk 版本11
kotlin 版本1.6,用的还是 kotlin-android-extensions 方案
gradle 版本 7.3.0
# 2. 遇到的问题以及解决方案
主要使用工具 AGP Update Assist 和 Android SDK update。android,gradle,kotlin 相互影响。android api 升级需要gradle 升级,gradle 升级又需要kotlin 升级。
1. 先把android api 升级到35,会发现需要gradle 升级,就把gradle 版本调整为8.7.0 ,结果发现根本下不来,最后采用腾讯镜像才完成升级,腾讯镜像地址是https\://mirrors.cloud.tencent.com/gradle/gradle-8.7-bin.zip。
1. 随后升级jdk 为17后,会碰到jdk_home 原来设置的是1.8 版本不一致的提示,修改路径到17的位置。
1. 修改build.gradle 过时的用法compileSdkVersion 更换为 compileSdk,targetSdk 更换为targetSdkVersion,compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}更换为 compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
4. kotlin 版本由 1.6.20 升级为 1.9.20,kotlin-android-extensions 更换为kotlin-kapt,引入kotlin-parcelize,使用room 框架的原来的 annotationProcessor "androidx.room:room-compiler:$room_version" 更换为 kapt "androidx.room:room-compiler:$room_version",另外
buildFeature 增加 viewBinding = true
5. kotlin 升级后导致报了很多语法错误,主要碰到的问题有:
<!---->
1. 1. 1. api 重载不匹配,有ondraw 方法,Animator.AnimatorListener 的重载方法,修改方法都是去掉?
1. when 没有覆盖所有条件,修改方法是增加else
1. 无效的引用,删除import kotlinx.android.synthetic.main.usecarselectcity.*
1. include id 对应的view 找不到熟悉比如visibility,需要给对应的Include 根节点增加id ,用根节点view
1. 自定义组件中直接使用的控件变量找不到定义,修改方法是需要再重新声明下,如 val tv_filter_time:TextView?=null;
1. 最复杂的一个问题是编译通过,但是合并mainfeist 报错,就需要用命令gradlew build --debug --info --stacktrace 才看问题后再解决。
以上是升级相关配置遇到的问题,只是api 升级后完成了工程的正确编译,并不包括需要的api 适配。