เวอร์ชัน 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 Runtime (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 environment

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

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

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

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

หากต้องการแก้ไขการกำหนดค่า JDK ของ Gradle ในโปรเจ็กต์ที่มีอยู่ ให้เปิดการตั้งค่า 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

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

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

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

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

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

เช่น ปลั๊กอิน Android Gradle เวอร์ชัน 8.x ต้องใช้ JDK 17 หากคุณพยายามเรียกใช้ Gradle 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/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 เวอร์ชันก่อนหน้าได้ผ่านกระบวนการที่เรียกว่าการแปลง ดู API ที่รองรับได้ที่ API ของ Java 11 ขึ้นไปที่พร้อมใช้งานผ่านการยกเลิกการเพิ่มน้ำตาล

ใช้ตารางนี้เพื่อดูว่า 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 และการทดสอบหน่วยระหว่างการสร้างด้วย

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

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

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

เราขอแนะนำให้คุณระบุ Toolchain ของ 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 ของ Toolchain อาจเหมือนกับ 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 ระบบจะใช้เวอร์ชันเริ่มต้น ที่เลือกโดยปลั๊กอิน Android Gradle (เช่น Java 8 ขึ้นไป)

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

พร็อพเพอร์ตี้ targetCompatibility และ jvmTarget จะกำหนดเวอร์ชันรูปแบบคลาส Java ที่ใช้เมื่อสร้างไบต์โค้ดสำหรับแหล่งที่มาของ 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"
    }
}

Groovy

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

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