ไม่ว่าซอร์สโค้ดจะเขียนด้วย Java, Kotlin หรือทั้ง 2 ภาษา คุณจะต้องเลือกเวอร์ชัน JDK หรือภาษา Java สำหรับบิลด์ในหลายๆ ที่
อภิธานศัพท์
- 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 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 ตามลำดับต่อไปนี้
- ตัวแปรสภาพแวดล้อม
STUDIO_JDK - ไดเรกทอรี
studio.jdk(ในการเผยแพร่ Android Studio) - ไดเรกทอรี
jbr(JetBrains Runtime) ในการแจกจ่าย Android Studio แนะนำ - ตัวแปรสภาพแวดล้อม
JDK_HOME - ตัวแปรสภาพแวดล้อม
JAVA_HOME - ไฟล์ปฏิบัติการ
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 จาก File (หรือ Android Studio ใน macOS) > Settings > 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
มาโครช่วยให้เลือกเส้นทาง 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 ที่ใช้ AGP กับ 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 = 36
}
ดึงดูด
android {
...
compileSdk 36
}
Android แต่ละเวอร์ชันรองรับ JDK เวอร์ชันที่เฉพาะเจาะจงและชุดย่อยของ Java API ที่มีให้บริการ หากคุณใช้ Java API ที่มีอยู่ใน compileSdk ซึ่งไม่มีใน minSdk ที่ระบุ คุณอาจใช้ API ใน Android เวอร์ชันก่อนหน้าได้ผ่านกระบวนการที่เรียกว่ากระบวนการ Desugaring
ดู API ที่รองรับได้ที่ Java 11+ API ที่พร้อมใช้งานผ่านกระบวนการ Desugaring
ใช้ตารางนี้เพื่อพิจารณาว่า 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 และ Unit Test ในระหว่างการบิลด์ด้วย
โดยค่าเริ่มต้น Toolchain จะใช้ JDK ที่ใช้เรียกใช้ Gradle หากคุณใช้ค่าเริ่มต้นและเรียกใช้บิลด์ในเครื่องต่างๆ (เช่น เครื่องในเครื่องและเซิร์ฟเวอร์การรวมอย่างต่อเนื่องแยกต่างหาก) ผลลัพธ์ของบิลด์อาจแตกต่างกันหากใช้ JDK เวอร์ชันที่แตกต่างกัน
หากต้องการสร้างบิลด์ที่สอดคล้องกันมากขึ้น คุณสามารถระบุเวอร์ชัน Java Toolchain อย่างชัดเจนได้ การระบุข้อมูลนี้
- ค้นหา JDK ที่เข้ากันได้ในระบบที่เรียกใช้บิลด์
- หากไม่มี JDK ที่เข้ากันได้ (และมีการกำหนดตัวแปลง Toolchain) ระบบจะดาวน์โหลด JDK
- แสดง Java API ของ Toolchain สำหรับการเรียกจากซอร์สโค้ด
- คอมไพล์แหล่งที่มาของ Java โดยใช้เวอร์ชันภาษา Java
- ระบุค่าเริ่มต้นสำหรับ
sourceCompatibilityและtargetCompatibility
เราขอแนะนำให้คุณระบุ Toolchain ของ Java เสมอ และตรวจสอบว่าได้ติดตั้ง JDK ที่ระบุไว้แล้ว หรือเพิ่มตัวแปลง Toolchain ลงในบิลด์
คุณสามารถระบุ Toolchain ได้ไม่ว่าซอร์สโค้ดจะเขียนด้วย Java, Kotlin หรือทั้ง 2 อย่าง ระบุ Toolchain ที่ระดับบนสุดของไฟล์ build.gradle(.kts) ของโมดูล
ระบุเวอร์ชัน Toolchain ของ Java ดังนี้
Kotlin
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
ดึงดูด
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
วิธีนี้ใช้ได้หากแหล่งที่มาเป็น Kotlin, Java หรือทั้ง 2 อย่างผสมกัน
เวอร์ชัน JDK ของ Toolchain อาจเหมือนกับ JDK ที่ใช้เรียกใช้ Gradle แต่โปรดทราบว่าทั้ง 2 อย่างมีวัตถุประสงค์ที่แตกต่างกัน
ฉันจะใช้ฟีเจอร์แหล่งที่มาของภาษา Java ใดได้บ้างในซอร์สโค้ด Java
พร็อพเพอร์ตี้ sourceCompatibility จะกำหนดฟีเจอร์ของภาษา Java ที่ใช้ได้ระหว่างการคอมไพล์แหล่งที่มาของ Java
แต่จะไม่ส่งผลต่อแหล่งที่มาของ Kotlin
ระบุ sourceCompatibility ในไฟล์ build.gradle(.kts) ของโมดูลดังนี้
Kotlin
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
}
}
ดึงดูด
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
}
}
หากไม่ได้ระบุไว้ พร็อพเพอร์ตี้นี้จะมีค่าเริ่มต้นเป็นเวอร์ชัน Java Toolchain หากคุณไม่ได้ใช้ Java Toolchain ระบบจะใช้เวอร์ชันที่ปลั๊กอิน Android Gradle เลือกโดยค่าเริ่มต้น (เช่น Java 8 ขึ้นไป)
ฉันจะใช้ฟีเจอร์ไบนารีของ Java ใดได้บ้างเมื่อคอมไพล์แหล่งที่มา Kotlin หรือ Java
พร็อพเพอร์ตี้ targetCompatibility จะกำหนดเวอร์ชันรูปแบบคลาส Java ที่ใช้เมื่อสร้างไบต์โค้ดสำหรับซอร์สโค้ด Java และ Kotlin ที่คอมไพล์แล้วตามลำดับ
ฟีเจอร์บางอย่างของ Kotlin มีอยู่ก่อนที่จะมีการเพิ่มฟีเจอร์ Java ที่เทียบเท่า
คอมไพเลอร์ Kotlin รุ่นแรกๆ ต้องสร้างวิธีของตนเองเพื่อแสดงฟีเจอร์ Kotlin เหล่านั้น ซึ่งฟีเจอร์บางอย่างเหล่านี้ได้เพิ่มลงใน Java ในภายหลัง
เมื่อใช้ targetCompatibility ระดับที่ใหม่กว่า คอมไพเลอร์ Kotlin อาจใช้ฟีเจอร์ Java โดยตรง ซึ่งอาจส่งผลให้มีประสิทธิภาพดีขึ้น
Android เวอร์ชันต่างๆ รองรับ Java เวอร์ชันที่แตกต่างกัน คุณสามารถใช้ประโยชน์จากฟีเจอร์เพิ่มเติมของ Java ได้โดยเพิ่ม targetCompatibility แต่อาจทำให้คุณต้องเพิ่มเวอร์ชัน Android SDK ขั้นต่ำด้วยเพื่อให้แน่ใจว่าฟีเจอร์จะพร้อมใช้งาน
โปรดทราบว่า targetCompatibility ต้องมากกว่าหรือเท่ากับ sourceCompatibility ในทางปฏิบัติ sourceCompatibility และ targetCompatibility ควรใช้ค่าเดียวกัน
โดยตั้งค่าได้ดังนี้
Kotlin
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
ดึงดูด
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
}
หากใช้ Kotlin เวอร์ชันต่ำกว่า 2.2 คุณจะต้องตั้งค่า kotlinOptions ด้วย ดังนี้
Kotlin
android {
kotlinOptions {
jvmTarget = "17"
}
}
ดึงดูด
android {
kotlinOptions {
jvmTarget = "17"
}
}
หากไม่ได้ระบุไว้ พร็อพเพอร์ตี้เหล่านี้จะใช้เวอร์ชัน Java toolchain เป็นค่าเริ่มต้น หากคุณไม่ได้ใช้ Java Toolchain ค่าเริ่มต้นอาจแตกต่างกันและทำให้เกิดปัญหาในการบิลด์ ดังนั้น เราขอแนะนำให้คุณระบุค่าเหล่านี้อย่างชัดเจนเสมอ หรือใช้ Java Toolchain