Android 平台主要使用 Java 8 语言特性,并逐步支持更新的 Java 版本(如 Java 11、17),但运行时环境并非标准的 Oracle JDK。

下面我们从几个层面来详细解释:
核心概念:Android 不使用标准的 Oracle JRE/JDK
首先要明确一个关键点:你电脑上安装的 Oracle JDK 或 OpenJDK,并不能直接用来运行 Android App,Android 有自己定制的运行时环境,主要是 ART (Android Runtime)。
- 过去 (Dalvik VM): 早期 Android 使用 Dalvik 虚拟机,它执行的是一种叫做 DEX (Dalvik Executable) 的格式文件,而不是标准的 Java
.class文件。 - (ART VM): 从 Android 5.0 (Lollipop) 开始,ART 成为默认运行时,ART 仍然使用 DEX 文件,但其执行效率和垃圾回收机制比 Dalvik 有了巨大提升。
Android 的运行时是 ART,它是一个专门为移动设备优化的、非标准的 Java 虚拟机。
Android 开发中使用的 Java 语言版本
这才是开发者最关心的问题:在写 Android 代码时,我可以用哪个版本的 Java 语法和特性?

Android 的支持是分阶段的,并且与 Gradle 插件版本紧密相关。
Java 7 (默认支持,早期时代)
在很长一段时间里,Android 开发默认使用 Java 7,你写的代码、使用的库,都必须兼容 Java 7。
Java 8 的全面普及 (里程碑)
这是一个巨大的飞跃,从 Android Studio 3.0 和 Gradle Plugin 3.0.0 开始,Android 官方正式支持 Java 8 的语言特性。
如何实现?
Android Gradle Plugin (AGP) 引入了一个叫做 Jack and Jill 的工具链(后来被更优化的工具取代),它能够将 Java 8 的字节码(包括 lambda 表达式、Stream API 等)直接转换成 DEX 代码,从而绕过了传统编译流程的限制。

你可以放心地在 Android 项目中使用所有 Java 8 的特性:
- Lambda 表达式 (
() -> {}) - Stream API (
list.stream().filter()...) - 接口中的默认方法 (
default void myMethod()) Optional类- 新的日期时间 API (
java.time.*) - 等等...
支持更新版本 (Java 11, 17, 21)
为了跟上现代 Java 的发展,Google 逐步支持了更新的版本。
-
支持 Java 11:
- AGP 4.2+ 和 Android Gradle Plugin 7.0+ 开始支持。
- 你需要在模块的
build.gradle文件中明确指定:android { compileOptions { sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 } // 或者使用新的 kts DSL // compileOptions { // sourceCompatibility = JavaVersion.VERSION_11 // targetCompatibility = JavaVersion.VERSION_11 // } } - 注意: 使用 Java 11 或更高版本,你通常需要配合 JDK 11 或更高版本来编译你的项目。
-
支持 Java 17:
- AGP 7.3+ 开始支持。
- 这是目前(截至 2025-2025 年)推荐的、较新的版本,可以利用 Java 17 的许多性能和语法改进。
-
实验性支持 Java 21:
- AGP 8.1+ 开始实验性支持。
- 这是最前沿的支持,包含了虚拟线程等新特性,但可能还不够稳定,建议在非关键项目中尝试。
如何在 Android Studio 中设置 Java 版本?
设置非常简单,主要在两个地方:
步骤 1: 指定项目的 JDK 版本
这是你的开发环境(Android Studio 本身)用来编译代码的 JDK。
- 打开
File->Project Structure...。 - 在
SDK Location标签页下,找到Gradle设置。 - 在
Gradle JDK下拉菜单中,选择一个已安装的 JDK(如 11, 17, 21),如果你没有,可以点击Download来下载。 - 点击
Apply和OK。
步骤 2: 指定模块的编译版本
这是告诉 Android Gradle Plugin,你的代码源码是哪个 Java 版本,以及要编译成哪个兼容的版本。
-
打开你 App 模块的
build.gradle(或build.gradle.kts) 文件。 -
在
android { ... }代码块内,添加或修改compileOptions:Groovy DSL:
android { compileSdk 34 // 建议使用最新的 SDK // ... 其他配置 compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } }Kotlin DSL (build.gradle.kts):
android { compileSdk = 34 // ... 其他配置 compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } }
总结表格
| 特性/版本 | 描述 | 关键点 |
|---|---|---|
| 运行时环境 | ART (Android Runtime) | 不是标准的 Oracle JRE/JDK,它执行的是 DEX 文件。 |
| Java 7 | 早期默认版本 | 很久以前的标准,现在新项目基本不会用。 |
| Java 8 | 现代 Android 开发的基石 | 从 AGP 3.0+ 开始全面支持,Lambda, Stream 等特性极大提升了开发体验。 |
| Java 11 | 当前主流/推荐版本 | 从 AGP 7.0+ 开始支持,需要配置 compileOptions 并配合 JDK 11 使用。 |
| Java 17 | 未来趋势/较新选择 | 从 AGP 7.3+ 开始支持,性能和语法更现代,新项目推荐使用。 |
| Java 21 | 实验性支持 | AGP 8.1+ 开始支持,可以尝试使用最新特性。 |
最佳实践建议
- 新项目: 直接使用 Java 17,这是目前兼顾了稳定性、性能和现代语法的最佳选择。
- 维护旧项目: 如果你的项目还在用 Java 8,完全没有问题,它依然非常强大和稳定,如果需要引入新库或利用新特性,再考虑升级到 Java 11 或 17。
- 保持同步: 确保你的 Gradle JDK 版本、
compileOptions中指定的版本 以及 项目依赖的库 之间尽量保持兼容,避免不必要的编译错误。 - 关注兼容性: 虽然你可以在代码中使用高版本的 Java,但最终你的 App 仍然需要运行在旧版本的 Android 系统上。语言版本和 Android API 级别是两个独立的维度,使用高版本的 Java 主要是为了开发便利和性能,不会直接提升 App 的系统版本要求。
