java&kotlin version

在使用android时,通常会遇到因为jvm版本不匹配导致的报错问题,因此现在说明一下关于这些内容。

通常我们可以看到以下内容

1
2
3
4
5
6
7
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}

java version and java bite code version

通常我们写出来的代码,即直接java代码这些被称为·java version,and另一个版本就是这些代码被转化为字节码即java bitecode version。通常java版本越高,我们可以使用到的语言功能越多。而java bitecode version通常发展的比java版本慢很多,他与我们可以使用到语言特点,功能没有直接的关系。

至于compileOptionskotlinOptions的区别是由于,在一个项目中,我们通常可以看到kotlinjava混用,而这就是分别对于他们的编译器版本

对于sourceCompatibility通常指的是我们能够使用到java版本,通常你可以设置为更高级的版本,但那并不意味这你看也i使用这些高版本的java功能。因为实际上android不一定能够支持这些高版本的java。例如android14才最高·1支持java17的版本,而android13以前都最高只支持java11的版本。

targetCompatibility在这里他指的是java bitecode version。你甚至可以设定为18,因为他不会对你选择的java版本的语言功能造成影响。而且java bitecode version通常可以和旧版本的兼容

kotlinOptions中的jvmTarget指的就是target的版本,也就是java bitecode version

版本冲突问题

通常对于你引入的library,或许他们支持的字节码版本是jvm18.而你的android的目标字节码版本是jvm8。那么他们很可能是兼容的,但这并不一定,也会有例外

很多时候的问题是因为gradle的版本问题,因为到了gradle8之后,他便必须使用jdk17以上