升级AGP至8.0.2后,如何保留Java 11编译兼容性?
解决AGP 8.0.2下Java 11编译目标与kapt冲突的问题
问题原因
AGP 8.x 要求使用JDK 17执行编译,但默认会将Kotlin的jvmTarget设为17。当你把Java的sourceCompatibility和targetCompatibility配置为11时,Java编译任务的目标版本(11)与kapt生成stub的Kotlin任务目标版本(17)不一致,就会触发兼容性错误。
解决方案
要保留Java 11的编译目标,核心是统一Java和Kotlin的JVM目标版本,在项目的build.gradle(或build.gradle.kts)中补充Kotlin的目标配置:
Groovy 语法
android { compileOptions { sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = '11' } }
Kotlin DSL 语法
android { compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = "11" } }
配置完成后,Java编译任务和kapt的stub生成任务会统一使用JVM 11作为目标版本,即可正常编译。
关于文档内容的澄清
官方文档中“Java或Kotlin源码可使用哪些Java API”,指的是源码允许调用的Java API级别;而sourceCompatibility/targetCompatibility、jvmTarget是控制生成的字节码兼容的JVM版本。AGP 8.x要求用JDK 17执行编译,但不强制生成JVM 17的字节码——只要统一Java和Kotlin的目标版本,你完全可以生成兼容JVM 11的字节码,同时满足源码API的使用要求。
内容的提问来源于stack exchange,提问作者Subodh Nijsure
相关产品推荐
相关产品推荐

