Android build 中的 Java 版本

无论您的源代码是用 Java 和/或 Kotlin 编写的, 必须在多个位置选择 JDK 或 Java 语言 使用

Gradle build 中的 JDK 关系概览

术语库

Java 开发套件 (JDK)
Java 开发套件 (JDK) 包含:
  • 编译器、性能分析器和归档创建器等工具。 它们会在您构建期间在后台使用, 创建应用
  • 包含可从 Kotlin 或 Java 源代码。请注意,并非所有函数 。
  • Java 虚拟机 (JVM),一种执行 Java 应用。您可以使用 JVM 来运行 Android Studio IDE 和 Gradle 构建工具。在 Android 上不使用 JVM 设备或模拟器
JetBrains 运行时 (JBR)
JetBrains 运行时 (JBR) 是一个增强的 JDK,通过 Android Studio 分发。 此版本经过了多项优化,可在 Studio 和相关的 JetBrains 中使用 还可用于运行其他 Java 应用。

如何选择 JDK 来运行 Android Studio?

我们建议您使用 JBR 运行 Android Studio。已部署 用于测试 Android Studio,还包含一些增强功能, Android Studio 的使用。为确保这一点,请勿将 STUDIO_JDK 环境变量。

Android Studio 的启动脚本会在以下命令中查找 JVM 订单:

  1. STUDIO_JDK 环境变量
  2. studio.jdk 目录(在 Android Studio 发行版中)
  3. Android Studio 中的 jbr 目录(JetBrains 运行时) 分发。推荐。
  4. JDK_HOME 环境变量
  5. JAVA_HOME 环境变量
  6. PATH 环境变量中的 java 可执行文件

如何选择使用哪个 JDK 运行我的 Gradle 构建?

如果您使用 Android Studio 中的按钮运行 Gradle, Android Studio 设置用于运行 Gradle。如果您在终端运行 Gradle, 在 Android Studio 内部或外部,JAVA_HOME 环境变量 (如果已设置)确定运行 Gradle 脚本的 JDK。如果JAVA_HOME 未设置,它将在您的 PATH 环境中使用 java 命令 变量。

为获得最一致的结果,请务必将 JAVA_HOME 设置为 环境变量 Android Studio 中的 Gradle JDK 配置与此相同 JDK。

在运行构建时,Gradle 会创建一个名为守护程序的进程 进行实际构建这个过程可以重复使用 只要构建使用相同的 JDK 和 Gradle 版本即可。重复使用 守护程序缩短了启动新 JVM 和初始化构建系统的时间。

如果您使用不同的 JDK 或 Gradle 版本开始构建,则需要 守护程序的创建,会消耗更多 CPU 和内存。

Android Studio 中的 Gradle JDK 配置

要修改现有项目的 Gradle JDK 配置,请打开 Gradle 在 File(或者,在 macOS 上,在 Android Studio)中设置 >设置 > 构建、执行、部署 >构建工具 >GradleGradle JDK 下拉菜单中包含以下选项:

  • JAVA_HOMEGRADLE_LOCAL_JAVA_HOME 等宏
  • 存储的 vendor-version 格式的 JDK 表条目(如 jbr-17) 在 Android 配置文件
  • 下载 JDK
  • 添加特定的 JDK
  • 从操作系统的默认 JDK 安装中本地检测到的 JDK 目录

选中的选项存储在gradleJvm选项中 项目的 .idea/gradle.xml 文件,其 JDK 路径解析用于运行 Gradle(通过 Android Studio 启动时)。

图 1. Android Studio 中的 Gradle JDK 设置。

这些宏支持动态项目 JDK 路径选择:

  • JAVA_HOME:使用同名的环境变量
  • GRADLE_LOCAL_JAVA_HOME:在java.home .gradle/config.properties 文件,默认为 JetBrains 运行时。

所选的 JDK 用于运行 Gradle 构建和解析 JDK API 在修改构建脚本和源代码时参考。请注意, 指定的 compileSdk 会进一步限制 在修改和构建源代码时可用。

请务必选择高于或等于 JDK 的 JDK 版本 。要确定 Android Gradle 插件 (AGP) 所需的最低 JDK 版本,请参阅 版本说明中的兼容性表格。

例如,Android Gradle 插件版本 8.x 需要 JDK 17。 如果您尝试运行的 Gradle build 使用该 build 的早期版本 JDK 时,它会报告如下消息:

An exception occurred applying plugin request [id: 'com.android.application']
> Failed to apply plugin 'com.android.internal.application'.
   > Android Gradle plugin requires Java 17 to run. You are currently using Java 11.
      Your current JDK is located in /usr/local/buildtools/java/jdk11
      You can try some of the following options:
       - changing the IDE settings.
       - changing the JAVA_HOME environment variable.
       - changing `org.gradle.java.home` in `gradle.properties`.

我可以在 Java 或 Kotlin 源代码中使用哪些 Java API?

Android 应用可以使用 JDK 中定义的部分(但非全部)API 。Android SDK 定义了许多 Java 库函数的实现 作为其可用 API 的一部分。compileSdk 属性用于指定 编译 Kotlin 或 Java 源代码时使用的 Android SDK 版本。

Kotlin

android {
    ...
    compileSdk = 33
}

Groovy

android {
    ...
    compileSdk 33
}

Android 的每个版本都支持特定版本的 JDK 和 可用的 Java API。如果您使用的 Java API 指定的 compileSdk 中不可用的 minSdk,您也许可以使用该 API 通过一个称为 脱糖。 如需了解具体支持情况,请参阅通过脱糖提供的 Java 11 及更高版本 API API。

使用此表确定所支持的 Java 版本 以及在何处可以找到有关可用 Java API 的详细信息。

Android Java 支持的 API 和语言功能
14 (API 34) 17 核心库
13 (API 33) 11 核心库
12 (API 32) 11 Java API
11 及更低版本 Android 版本

哪个 JDK 可以编译我的 Java 源代码?

Java 工具链 JDK 包含用于编译任何 Java 的 Java 编译器 源代码。此 JDK 还会在构建期间运行 javadoc 和单元测试。

工具链默认使用用于运行 Gradle 的 JDK。如果您使用默认值 并在不同的机器(例如,您的本地机器和 单独的持续集成服务器)、构建结果 如果使用不同的 JDK 版本,则可能会有所不同。

要创建更一致的构建,您可以明确指定 Java 工具链版本。指定此属性:

  • 在运行构建的系统上找到兼容的 JDK。
    • 如果不存在兼容的 JDK(并且定义了工具链解析器),则 下载一个。
  • 公开用于从源代码进行调用的工具链 Java API。
  • 使用 Java 语言版本编译 Java 源代码。
  • sourceCompatibilitytargetCompatibility

我们建议您始终指定 Java 工具链,并确保 指定的 JDK 的安装,或者添加 工具链解析器 添加到您的 build 中。

无论源代码是用 Java 编写,还是使用 Java 编写,您都可以指定工具链。 Kotlin 或两者兼具。在模块的顶层指定工具链 build.gradle(.kts) 文件。

按如下方式指定 Java 工具链版本:

Kotlin

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

Groovy

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

如果您的源代码是 Kotlin 和/或 Java,这很实用。

工具链 JDK 版本可与用于运行 Gradle 的 JDK 相同,但 请注意,它们的用途不同

我可以在 Java 源代码中使用哪些 Java 语言源功能?

sourceCompatibility 属性决定了哪些 Java 语言功能 在编译 Java 源代码期间可用。 这不会影响 Kotlin 源代码。

如果未指定,则默认为 Java 工具链或 用于运行 Gradle 的 JDK。我们建议您始终明确指定 工具链(首选)或 sourceCompatibility

在模块的 build.gradle(.kts) 文件中指定 sourceCompatibility

Kotlin

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
    }
}

Groovy

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
    }
}

编译 Kotlin 或 Java 源代码时,可以使用哪些 Java 二进制功能?

指定 targetCompatibilityjvmTarget 决定了 Java 为编译的 Java 和 Kotlin 生成字节码时使用的类格式版本 来源。

一些 Kotlin 功能在添加等效的 Java 功能之前就已存在。 早期的 Kotlin 编译器必须创建自己的方法来表示这些 Kotlin 代码 功能。其中一些功能后来被添加到 Java 中。 有了更高的 jvmTarget 级别后,Kotlin 编译器可以直接使用 Java 功能,这样可能会提升性能。

targetCompatibility 默认为 sourceCompatibility, 但如果指定,则必须大于或等于 sourceCompatibility

jvmTarget 默认为 toolchain 版本。

不同版本的 Android 支持不同版本的 Java。您可以 以便充分利用其他 Java 功能, targetCompatibilityjvmTarget,但这可能会迫使您同时 提高 最低 Android SDK 版本 相应功能是否可用

Kotlin

android {
    compileOptions {
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = "17"
    }
}

Groovy

android {
    compileOptions {
        targetCompatibility JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget '17'
    }
}