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

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

ภาพรวมความสัมพันธ์ JDK ในบิลด์ Gradle

อภิธานศัพท์

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

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

การกำหนดค่า Gradle JDK ใน Android Studio

หากต้องการแก้ไขการกำหนดค่า Gradle JDK ของโปรเจ็กต์ที่มีอยู่ ให้เปิด Gradle การตั้งค่าจากไฟล์ (หรือ Android Studio ใน macOS) > การตั้งค่า > สร้าง, ดำเนินการ, ทำให้ใช้งานได้ > เครื่องมือสร้าง > 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

วันที่
รูปที่ 1 การตั้งค่า 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 ที่ใช้เวอร์ชันของ 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/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 API ใดในซอร์สโค้ด Java หรือ Kotlin ของฉัน

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

Kotlin

android {
    ...
    compileSdk = 33
}

ดึงดูด

android {
    ...
    compileSdk 33
}

Android แต่ละเวอร์ชันรองรับ JDK เวอร์ชันเฉพาะและชุดย่อยของ Java API ที่พร้อมใช้งาน หากคุณใช้ Java API ที่มีใน compileSdk ที่ไม่มีอยู่ใน คุณ minSdk คุณอาจใช้ API นี้ได้ ใน Android เวอร์ชันก่อนหน้าผ่านกระบวนการที่เรียกว่า ใช้สารดูดน้ำตาล ดู Java 11+ API ที่พร้อมให้บริการผ่านการย่อยน้ำตาลเพื่อดูการรองรับ 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 Toolchain JDK มีคอมไพเลอร์ Java ที่ใช้ในการคอมไพล์ Java ซอร์สโค้ด JDK นี้ยังเรียกใช้ Javadoc และการทดสอบหน่วยระหว่างบิลด์ด้วย

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

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

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

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

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

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

Kotlin

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

ดึงดูด

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

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

เวอร์ชันเครื่องมือเชน JDK สามารถเหมือนกับเวอร์ชัน JDK ที่ใช้เรียกใช้ Gradle ได้ แต่ทำหน้าที่ไม่เหมือนกัน

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

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

หากไม่ได้ระบุ ค่าเริ่มต้นจะเป็น Java Toolchain หรือ JDK เคยเรียกใช้ Gradle เราขอแนะนำให้คุณระบุ Toolchain (แนะนำ) หรือ sourceCompatibility

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

Kotlin

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
    }
}

ดึงดูด

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
    }
}

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

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

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

targetCompatibility มีค่าเริ่มต้นเป็นค่าเดียวกับ sourceCompatibility, แต่หากระบุ ค่าดังกล่าวต้องมากกว่าหรือเท่ากับ sourceCompatibility

jvmTarget มีค่าเริ่มต้นเป็นเวอร์ชัน toolchain

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

Kotlin

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

ดึงดูด

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