sourceCompatibility控制源代码语法兼容性,即编译器按指定Java版本标准检查代码:设为1.8可使用lambda、默认方法,设为17可使用密封类、模式匹配等特性,但不影响字节码版本或运行环境。

sourceCompatibility 控制的是 Java 源码能用哪些语言特性,它不决定运行在什么设备上,只影响编译器是否允许你写某类语法。
它到底管什么
这个配置告诉 Gradle 的 Java 编译器:“你按哪个 Java 版本的标准去检查我的源代码”。比如设为 JavaVersion.VERSION_1_8,你就可放心用 lambda 表达式、方法引用、接口默认方法;设为 VERSION_17,就能用密封类、switch 表达式、模式匹配等新特性。
它和字节码版本无关——targetCompatibility 或 JVM 运行环境才管生成的 class 文件能不能在旧 Android 设备上跑。
常见写法与含义
在模块级 build.gradle 的 android.compileOptions 块里配置:
-
sourceCompatibility JavaVersion.VERSION_1_8→ 支持 Java 8 语法(Android Studio 默认值) -
sourceCompatibility = "11"→ 字符串写法,等效于JavaVersion.VERSION_11 -
sourceCompatibility = JavaVersion.VERSION_17→ 需配合 AGP 7.2+ 和compileSdkVersion 33+才能安全启用
注意:Kotlin 项目还需同步设置 kotlinOptions.jvmTarget,否则 Kotlin 编译器可能生成不兼容的字节码。
容易踩的坑
错误示例:把 sourceCompatibility 设为 17,但 minSdkVersion 是 21 —— 语法能编过,但某些 API(如 String.isBlank())在低版本系统上会抛 NoSuchMethodError。
关键点不是“能不能编译”,而是“能不能运行”。真正限制运行时能力的是 minSdkVersion 和 Desugar 是否开启。
如果用了 Java 8+ 的新 API(如 java.time),记得确认 android.enableCoreLibraryDesugaring = true 已启用,并添加对应依赖。











