文章目录
- 问题:
- 解决办法:
- gradle与 java的版本兼容
- AGP与Gradle的版本兼容
- kotlin 与 jvm 的版本兼容
- KGP、Gradle、AGP兼容关系
- kotlin 与 java 的编译版本配置
问题:
你从githb上clone了一个项目,本地跑的时候,各种报错。如果这个项目没问题,大概率是Android Studio的版本不一致引起的的
解决办法:
gradle与 java的版本兼容
因为现在Android Studio,自带java环境,不同版本的AS,对应的jdk版本不一致,这个jdk版本会设置到Gradle的JDK,如下图:
根据项目里gradle的版本 和 Java Runtime和Gradle的版本兼容性文档:Compatibility Matrix,修改Gradle JDK为兼容的版本。如果源项目是可以正常运行的,那此时应该没问题了。
问题:
在我实际测试中, gradle-wrapper.properties中配置了版本 distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
,发现 切换jbr-17和jbr-21,都会报如下错误,
Your build is currently configured to use incompatible Java 21.0.3 and Gradle 7.6. Cannot sync the project.We recommend upgrading to Gradle version 8.9.The minimum compatible Gradle version is 8.5.The maximum compatible Gradle JVM version is 19.
解决:
设置了Gradle JDK 为 手动下载的java 17,这个错误只有在需要下载三方依赖库时,才会被触发,也就是说如果项目Gradle Sync执行成功了一次后,在不需要下载三方依赖库的情况下,修改Gradle JDK为不兼容的版本,也是可以再次Gradle Sync成功
AGP与Gradle的版本兼容
如果你是修改了gradle的版本,保持Gradle JDK不变,那么还需要检查AGP的版本,AGP与Gradle的版本兼容文档: Android Gradle plugin 8.7 release notes
AGP 对Android SDK 也有版本要求,也在该文档中,进行查询 。
kotlin 与 jvm 的版本兼容
如果你的代码用到了kotlin,需要注意kotlin与java版本的关系,在kotlin的每个大版本的介绍文档中都有介绍, 例如: What’s new in Kotlin 2.1.0 的kotlin-jvm
如果懒得翻文档,这里有个表格 Which versions of Kotlin are compatible with which versions of Java?
KGP、Gradle、AGP兼容关系
KGP、Gradle、AGP兼容关系
问题:
不兼容的高版本Gradle,可能指定 过高的jvm去编译kotlin,例如:出现Unknown Kotlin JVM target: 21
错误 ,可能是 Android Studio升级到最新版,你升级了Gradle版本,KGP没有跟着升
三种解决办法:
第一种:升级KGP 到支持jvm 21 的版本
第二种:降低Gradle版本,分析是高版本的Gradle,默认指定使用 jvm21去编译kotlin 导致的。
第三种:kotlin 与 java 的编译版本
kotlin 与 java 的编译版本配置
根据文档介绍 Check for JVM target compatibility of related compile tasks,可以手动保证java和kotlin的编译版本一致,也可以使用toolchain(自动发现和安装需要的jdk)
下面介绍手动配置编译:
Compiler options in the Kotlin Gradle plugin 介绍了配置kotlin编译选项的三种方式,每种都可以对kotlin的编译版本进行配置
import org.jetbrains.kotlin.gradle.dsl.JvmTargetandroid {// 配置java的目标版本compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
}// 配置编译kotlin的jvm版本
kotlin {compilerOptions {jvmTarget = JvmTarget.JVM_1_8}
}
拓展: kotlin-stdlib-jdk8的作用