เวอร์ชัน Java ใน Android บิลด์

ไม่ว่าซอร์สโค้ดจะเขียนด้วย Java, Kotlin หรือทั้ง 2 อย่าง คุณต้องเลือกเวอร์ชัน JDK หรือภาษา Java สำหรับบิลด์ในหลายตำแหน่ง

ภาพรวมความสัมพันธ์ของ JDK ในบิลด์ Gradle
รูปที่ 1 ความสัมพันธ์ของ JDK ในบิลด์

อภิธานศัพท์

ชุดพัฒนาซอฟต์แวร์ Java (JDK)
ชุดพัฒนาซอฟต์แวร์ Java (JDK) ประกอบด้วยสิ่งต่อไปนี้
  • เครื่องมือต่างๆ เช่น คอมไพเลอร์ เครื่องมือวิเคราะห์ และเครื่องมือสร้างไฟล์เก็บถาวร ซึ่งจะใช้อยู่เบื้องหลังระหว่างการสร้างเพื่อสร้างแอปพลิเคชัน
  • ไลบรารีที่มี API ที่คุณเรียกใช้ได้จากซอร์สโค้ด Kotlin หรือ Java โปรดทราบว่าฟังก์ชันบางอย่างอาจไม่พร้อมใช้งานใน Android
  • เครื่องเสมือน Java (JVM) ซึ่งเป็นโปรแกรมแปลภาษาที่เรียกใช้แอปพลิเคชัน Java คุณใช้ JVM เพื่อเรียกใช้ IDE ของ Android Studio และเครื่องมือสร้าง Gradle JVM ไม่ได้ใช้ในอุปกรณ์หรือโปรแกรมจำลองของ Android
รันไทม์ของ JetBrains (JBR)
JetBrains Runtime (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. jbr (รันไทม์ JetBrains) ในแพ็กเกจ Android Studio แนะนำ
  4. JDK_HOME ตัวแปรสภาพแวดล้อม
  5. ตัวแปรสภาพแวดล้อม JAVA_HOME
  6. java ที่เรียกใช้ได้ในตัวแปรสภาพแวดล้อม PATH

ฉันจะเลือก JDK ที่รันบิลด์ Gradle ได้อย่างไร

หากคุณเรียกใช้ Gradle โดยใช้ปุ่มใน Android Studio ระบบจะใช้ JDK ที่ตั้งค่าไว้ในการตั้งค่า Android Studio เพื่อเรียกใช้ Gradle หากคุณเรียกใช้ Gradle ในเทอร์มินัลไม่ว่าจะภายในหรือภายนอก Android Studio ตัวแปรสภาพแวดล้อม JAVA_HOME (หากตั้งค่าไว้) จะกำหนดว่า JDK ใดจะเรียกใช้สคริปต์ Gradle หากไม่ได้ตั้งค่า JAVA_HOME ระบบจะใช้คำสั่ง java ในตัวแปรสภาพแวดล้อม PATH

ตรวจสอบว่าคุณได้ตั้งค่าJAVA_HOMEตัวแปรสภาพแวดล้อม และการกำหนดค่า Gradle JDK ใน Android Studio เป็น JDK เดียวกันเพื่อให้ได้ผลลัพธ์ที่สอดคล้องกันมากที่สุด

เมื่อเรียกใช้บิลด์ Gradle สร้างกระบวนการที่เรียกว่า daemon เพื่อดำเนินบิลด์จริง คุณนํากระบวนการนี้ไปใช้ซ้ำได้ ตราบใดที่บิลด์ใช้ JDK และ Gradle เวอร์ชันเดียวกัน การใช้โปรแกรมเดรัมซ้ำจะช่วยลดเวลาในการเริ่ม JVM ใหม่และเริ่มต้นระบบการบิลด์

หากเริ่มต้นบิลด์ด้วย JDK หรือ Gradle เวอร์ชันอื่น ระบบจะสร้าง Daemon เพิ่มด้วย ทำให้ใช้ CPU และหน่วยความจำมากขึ้น

การกําหนดค่า JDK ของ Gradle ใน Android Studio

หากต้องการแก้ไขการกำหนดค่า Gradle JDK ของโปรเจ็กต์ที่มีอยู่ ให้เปิดการตั้งค่า Gradle จาก File (หรือ Android Studio ใน macOS) > การตั้งค่า > Build, Execution, Deployment > Build Tools > Gradle เมนูแบบเลื่อนลง Gradle JDK จะมีตัวเลือกต่อไปนี้ให้เลือก

  • มาโคร เช่น JAVA_HOME และ GRADLE_LOCAL_JAVA_HOME
  • รายการตาราง JDK ในรูปแบบ vendor-version เช่น jbr-17 ซึ่งจัดเก็บอยู่ในไฟล์การกําหนดค่า Android
  • การดาวน์โหลด JDK
  • การเพิ่ม JDK ที่เฉพาะเจาะจง
  • JDK ที่ตรวจพบในเครื่องจากไดเรกทอรีการติดตั้ง JDK เริ่มต้นของระบบปฏิบัติการ

ระบบจะจัดเก็บตัวเลือกที่เลือกไว้ในตัวเลือก gradleJvm ในไฟล์ .idea/gradle.xml ของโปรเจ็กต์ และจะใช้ความละเอียดเส้นทาง JDK เพื่อเรียกใช้ Gradle เมื่อเริ่มต้นผ่าน Android Studio

รูปที่ 2 การตั้งค่า Gradle JDK ใน Android Studio

มาโครเหล่านี้เปิดใช้การเลือกเส้นทาง JDK ของโปรเจ็กต์แบบไดนามิก

  • JAVA_HOME: ใช้ตัวแปรสภาพแวดล้อมที่มีชื่อเดียวกัน
  • GRADLE_LOCAL_JAVA_HOME: ใช้พร็อพเพอร์ตี้ java.home ในไฟล์ .gradle/config.properties ซึ่งค่าเริ่มต้นคือรันไทม์ JetBrains

ระบบจะใช้ JDK ที่เลือกเพื่อเรียกใช้บิลด์ Gradle และแก้ไขการอ้างอิง JDK API เมื่อแก้ไขสคริปต์บิลด์และซอร์สโค้ด โปรดทราบว่า compileSdk ที่ระบุจะจำกัดยิ่งขึ้นว่าสัญลักษณ์ Java ใดจะใช้ได้เมื่อแก้ไขและสร้างซอร์สโค้ด

ตรวจสอบว่าเลือกเวอร์ชัน JDK ที่สูงกว่าหรือเท่ากับเวอร์ชัน JDK ที่ปลั๊กอินใช้ในเวอร์ชัน Gradle หากต้องการดูเวอร์ชัน JDK ขั้นต่ำที่จำเป็นสำหรับปลั๊กอิน Android Gradle (AGP) โปรดดูตารางความเข้ากันได้ในบันทึกประจำรุ่น

เช่น ปลั๊กอิน Android Gradle เวอร์ชัน 8.x ต้องใช้ JDK 17 หากคุณพยายามเรียกใช้บิลด์ Gradle ที่ใช้ 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/jdk
      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 API ใดได้บ้างในซอร์สโค้ด Java หรือ Kotlin

แอปพลิเคชัน Android สามารถใช้ API บางรายการที่กำหนดไว้ใน JDK ได้ แต่ไม่ใช่ API ทั้งหมด Android SDK กําหนดการใช้งานฟังก์ชันไลบรารี Java หลายรายการเป็นส่วนหนึ่งของ API ที่พร้อมใช้งาน พร็อพเพอร์ตี้ compileSdk จะระบุเวอร์ชันของ Android SDK ที่จะใช้เมื่อคอมไพล์ซอร์สโค้ดของ Kotlin หรือ Java

Kotlin

android {
    ...
    compileSdk = 33
}

Groovy

android {
    ...
    compileSdk 33
}

Android แต่ละเวอร์ชันรองรับ JDK แต่ละเวอร์ชันและ Java API บางส่วนที่ใช้ได้ หากคุณใช้ Java API ที่มีให้บริการใน compileSdk แต่ไม่พร้อมใช้งานใน minSdk ที่ระบุ คุณอาจใช้ API ดังกล่าวใน Android เวอร์ชันเก่าได้ผ่านกระบวนการที่เรียกว่า Desugaring ดู API ของ Java 11 ขึ้นไปที่ใช้ได้ผ่านการถอด Sugar เพื่อดู API ที่รองรับ

ใช้ตารางนี้เพื่อดูว่า Android 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 ของฉัน

JDK ของชุดเครื่องมือ Java มีคอมไพเลอร์ Java ที่ใช้คอมไพล์ซอร์สโค้ด Java JDK นี้จะเรียกใช้ Javadoc และการทดสอบ 1 หน่วยระหว่างการสร้างด้วย

เครื่องมือนี้จะตั้งค่าเริ่มต้นเป็น JDK ที่ใช้เรียกใช้ Gradle หากคุณใช้ JDK เริ่มต้นและเรียกใช้บิลด์ในเครื่องที่แตกต่างกัน (เช่น เครื่องของคุณเองและเซิร์ฟเวอร์การผสานรวมอย่างต่อเนื่องแยกต่างหาก) ผลลัพธ์ของบิลด์อาจแตกต่างกันหากใช้ JDK เวอร์ชันอื่น

หากต้องการสร้างบิลด์ที่สอดคล้องกันมากขึ้น คุณสามารถระบุเวอร์ชันของเครื่องมือทางเทคนิค Java อย่างชัดเจน การระบุข้อมูลนี้

  • ค้นหา JDK ที่เข้ากันได้ในระบบที่ใช้บิลด์
    • หากไม่มี JDK ที่เข้ากันได้ (และมีการกําหนดเครื่องมือแก้ไขชุดเครื่องมือ) ระบบจะดาวน์โหลด JDK
  • แสดง Java API ของเครื่องมือทางเทคนิคสำหรับการเรียกจากซอร์สโค้ด
  • คอมไพล์ซอร์สโค้ด Java โดยใช้เวอร์ชันภาษา Java
  • ค่าเริ่มต้นของอุปกรณ์สำหรับ sourceCompatibility และ targetCompatibility

เราขอแนะนำให้คุณระบุเครื่องมือทางเทคนิคของ Java เสมอ และตรวจสอบว่าได้ติดตั้ง JDK ที่ระบุไว้แล้ว หรือเพิ่มเครื่องมือแก้ไขเครื่องมือทางเทคนิคลงในบิลด์

คุณสามารถระบุเครื่องมือทางเทคนิคได้ไม่ว่าซอร์สโค้ดจะเขียนด้วย Java, Kotlin หรือทั้ง 2 อย่าง ระบุเครื่องมือที่ระดับบนสุดของไฟล์build.gradle(.kts)ของโมดูล

ระบุเวอร์ชันของเครื่องมือเชน Java ดังนี้

Kotlin

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

Groovy

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

ซึ่งจะใช้ได้หากแหล่งที่มาเป็น Kotlin, Java หรือผสมกัน

เวอร์ชัน JDK ของเครื่องมือทํางานอาจเหมือนกับ JDK ที่ใช้เรียกใช้ Gradle แต่โปรดทราบว่าเครื่องมือทํางานมีวัตถุประสงค์ต่างกัน

ฟีเจอร์ใดของที่มาภาษา Java ที่ฉันสามารถใช้ในซอร์สโค้ด Java ของฉัน

พร็อพเพอร์ตี้ sourceCompatibility กำหนดฟีเจอร์ภาษา Java ที่พร้อมใช้งานระหว่างการคอมไพล์ซอร์สของ Java แต่ไม่ส่งผลต่อซอร์สโค้ด Kotlin

ระบุ sourceCompatibility ในไฟล์ build.gradle(.kts) ของโมดูลดังนี้

Kotlin

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
    }
}

Groovy

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
    }
}

หากไม่ได้ระบุ ค่าเริ่มต้นของพร็อพเพอร์ตี้นี้จะใช้เป็นเวอร์ชัน Java toolchain หากคุณไม่ได้ใช้ชุดเครื่องมือ Java เครื่องมือดังกล่าวจะเป็นเวอร์ชันเริ่มต้นที่ปลั๊กอิน Gradle ของ Android เลือก (เช่น Java 8 ขึ้นไป)

ฟีเจอร์ไบนารีของ Java ใดบ้างที่ฉันใช้ได้เมื่อคอมไพล์ซอร์สโค้ด Kotlin หรือ Java

พร็อพเพอร์ตี้ targetCompatibility และ jvmTarget จะกำหนดเวอร์ชัน Java Class-Format ที่ใช้เมื่อสร้างไบต์โค้ดสำหรับซอร์สของ Java และ Kotlin ที่คอมไพล์แล้ว

ฟีเจอร์บางอย่างของ Kotlin มีอยู่ก่อนที่จะเพิ่มฟีเจอร์ Java ที่เทียบเท่ากัน คอมไพเลอร์ Kotlin รุ่นแรกๆ ต้องสร้างวิธีของตัวเองเพื่อแสดงฟีเจอร์ Kotlin เหล่านั้น คุณลักษณะเหล่านี้บางส่วนได้เพิ่มเข้ามาใน Java ในภายหลัง เมื่อใช้ jvmTarget ระดับที่ใหม่กว่า คอมไพเลอร์ Kotlin อาจใช้ฟีเจอร์ Java โดยตรง ซึ่งอาจส่งผลให้ประสิทธิภาพดีขึ้น

Android แต่ละเวอร์ชันรองรับ Java เวอร์ชันต่างกัน คุณใช้ประโยชน์จากฟีเจอร์ Java เพิ่มเติมได้โดยเพิ่ม targetCompatibility และ jvmTarget แต่อาจบังคับให้เพิ่มเวอร์ชัน SDK ขั้นต่ำของ Android ด้วยเพื่อให้ฟีเจอร์ใช้งานได้

โปรดทราบว่า targetCompatibility ต้องมากกว่าหรือเท่ากับ sourceCompatibility ในทางปฏิบัติ โดยทั่วไปแล้ว sourceCompatibility, targetCompatibility และ jvmTarget ควรใช้ค่าเดียวกัน โดยคุณตั้งค่าได้ดังนี้

Kotlin

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

Groovy

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

หากไม่ได้ระบุ ระบบจะใช้เวอร์ชันเครื่องมือทํางาน Java เป็นค่าเริ่มต้น หากคุณไม่ได้ใช้ Java Toolchain ค่าเริ่มต้นอาจแตกต่างและทำให้เกิดปัญหาในการสร้าง ดังนั้น เราขอแนะนำให้คุณระบุค่าเหล่านี้อย่างชัดเจนเสมอหรือใช้เครื่องมือทางเทคนิคของ Java