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

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

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

อภิธานศัพท์

ชุดพัฒนาซอฟต์แวร์ Java (JDK)
ชุดพัฒนาซอฟต์แวร์ Java (JDK) ประกอบด้วยสิ่งต่อไปนี้
  • เครื่องมือต่างๆ เช่น คอมไพเลอร์ เครื่องมือวิเคราะห์ และเครื่องมือสร้างไฟล์เก็บถาวร ซึ่งจะใช้อยู่เบื้องหลังระหว่างการสร้างเพื่อสร้างแอปพลิเคชัน
  • ไลบรารีที่มี API ที่คุณเรียกใช้ได้จากซอร์สโค้ด Kotlin หรือ Java โปรดทราบว่าฟังก์ชันบางอย่างอาจไม่พร้อมใช้งานใน Android
  • Java Virtual Machine (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 Runtime) ในดิสทริบิวชัน 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 และหน่วยความจำมากขึ้น

การกำหนดค่า Gradle JDK ใน 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 แต่ใช้ไม่ได้ทั้งหมด 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 Toolchain มีคอมไพเลอร์ Java ที่ใช้ในการคอมไพล์ซอร์สโค้ดของ Java JDK นี้จะเรียกใช้ Javadoc และการทดสอบ 1 หน่วยระหว่างการสร้างด้วย

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

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

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

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

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

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

Kotlin

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

Groovy

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

ซึ่งจะใช้ได้หากแหล่งที่มาของคุณคือ Kotlin, Java หรือทั้ง 2 อย่างร่วมกัน

เวอร์ชัน 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 แต่วิธีนี้อาจทำให้คุณต้องเพิ่มเวอร์ชัน Android SDK ขั้นต่ำด้วยเพื่อให้ฟีเจอร์ใช้งานได้

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

Kotlin

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

ดึงดูด

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

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