Android 建構作業中的 Java 版本

無論原始碼是以 Java 和 Kotlin 編寫, 有幾個地方必須選擇 JDK 或 Java 語言 專屬版本

Gradle 建構作業中的 JDK 關係總覽

詞彙解釋

Java Development Kit (JDK)
Java Development Kit (JDK) 包含:
  • 提供編譯器、分析器和封存建立者等工具。 可在建構期間的幕後使用 建立應用程式
  • 包含可透過 Cloud 控制台呼叫的 API 的程式庫 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 Runtime) 發行。推薦影片。
  4. JDK_HOME 環境變數
  5. JAVA_HOME 環境變數
  6. PATH 環境變數中的 java 執行檔

如何選擇用來執行 Gradle 版本的 JDK?

如果您使用 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 會建立一個名為 daemon 的程序,以便 實際執行建構作業這項程序可以重複利用 前提是這些版本使用相同的 JDK 和 Gradle 版本。重複使用 Daemon 可縮短啟動新 JVM 及初始化建構系統的時間。

如果您使用不同的 JDK 或 Gradle 版本開始建構, 建立的 Daemon 會耗用更多 CPU 和記憶體。

Android Studio 中的 Gradle JDK 設定

如要修改現有專案的 Gradle JDK 設定,請開啟 Gradle 設定檔案 (在 macOS 為 Android Studio)>設定 > 建構、執行、部署 >建構工具 >GradleGradle JDK 下拉式選單,其中包含下列選項:

  • 巨集,例如 JAVA_HOMEGRADLE_LOCAL_JAVA_HOME
  • JDK 資料表項目,格式為 vendor-version,例如儲存的 jbr-17 瀏覽 Android 設定檔頁面
  • 下載 JDK
  • 新增特定 JDK
  • 從作業系統的預設 JDK 安裝中偵測到的 JDK 目錄

所選選項會儲存在gradleJvm 專案的 .idea/gradle.xml 檔案,以及其 JDK 路徑解析度 透過 Android Studio 啟動時的 Gradle。

圖 1:Android Studio 中的 Gradle JDK 設定。

巨集會啟用動態專案的 JDK 路徑選取功能:

  • JAVA_HOME:使用同名的環境變數
  • GRADLE_LOCAL_JAVA_HOME:使用以下語言中的 java.home 屬性: 預設為 JetBrains Runtime 的 .gradle/config.properties 檔案。

所選 JDK 會用於執行 Gradle 版本及解析 JDK API 參照。請注意, 指定的 compileSdk 會進一步限制哪些 Java 符號 編輯及建構原始碼時即可使用。

請務必選擇大於或等於 JDK 的 JDK 版本 您在 Gradle 建構作業中使用的外掛程式所使用的版本。為了判斷 Android Gradle 外掛程式 (AGP) 需要的 JDK 最低版本)。詳情請參閱 請參閱版本資訊中的相容性表格。

舉例來說,Android Gradle 外掛程式 8.x 版需要 JDK 17。 如果您嘗試執行 Gradle 建構作業,而該建構作業使用的是舊版 而會回報如下訊息:

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,但並非所有 API 我們很快就會深入探討 所以目前先概略介紹Android SDK 定義許多 Java 程式庫函式的實作 當做可用 API 的一部分compileSdk 屬性會指定 編譯 Kotlin 或 Java 原始碼時使用的 Android SDK 版本。

Kotlin

android {
    ...
    compileSdk = 33
}

Groovy

android {
    ...
    compileSdk 33
}

每個 Android 版本都支援特定版本的 JDK 以及部分 JDK 以及可用的 Java API如果您使用的 Java API 支援 在指定的 compileSdk 中無法使用 minSdk,您可以使用這個 API 也就是舊版 Android。 脫糖。 如要瞭解支援資訊,請參閱「可透過脫糖程序使用的 Java 11 以上版本 API」 相互整合

請參閱下表,確認支援的 Java 版本 每個 Android API,以及如何找到有關可用 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 編譯器 Cloud Build 觸發條件 會在您變更原始碼時自動啟動建構作業此 JDK 也會在建構期間執行 javadoc 和單元測試。

工具鍊預設為用來執行 Gradle 的 JDK。如果使用預設值 並在不同的機器 (例如您的本機電腦) 上執行建構作業 持續整合伺服器),建構結果 如果使用不同的 JDK 版本,也會有所差異。

如要建立更一致的版本,您可以明確指定 Java 工具鍊版本。指定:

  • 在執行建構的系統上找出相容的 JDK。
    • 如果沒有相容的 JDK (且已定義工具鍊解析器), 至少下載了一項
  • 為來自原始碼的呼叫公開工具鍊 Java API。
  • 使用 Java 語言版本編譯 Java 原始碼。
  • sourceCompatibility 和 的供應預設值 targetCompatibility

建議您一律指定 Java 工具鍊,並確保 指定的 JDK 已完成安裝 工具鍊解析器 您的建構。

您可以指定工具鍊,無論原始碼是以 Java 或 Java 編寫, Kotlin 或兩者皆用。請在模組的頂層指定工具鍊 build.gradle(.kts) 檔案。

指定 Java 工具鍊版本,如下所示:

Kotlin

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

Groovy

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

如果來源是 Kotlin、Java 或兩者並用,這種做法就會有作用。

Toolchain 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 程式 針對已編譯的 Java 和 Kotlin 產生位元碼時使用的類別格式版本 來源。

在新增對等的 Java 功能之前,就已經存在一些 Kotlin 功能。 早期 Kotlin 編譯器必須建立自己的方式來表示這些 Kotlin 接著介紹網際網路通訊層 包括兩項主要的安全防護功能其中部分功能稍後新增至 Java。 之後的 jvmTarget 層級可能會直接使用 Kotlin 編譯器 Java 功能,有助於提高效能。

targetCompatibility 預設為與 sourceCompatibility, 但是如有指定,其必須大於或等於 sourceCompatibility

jvmTarget 預設為工具鍊版本。

不同 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'
    }
}