ไม่ว่าซอร์สโค้ดจะเขียนด้วย Java, Kotlin หรือทั้ง 2 อย่าง คุณต้องเลือกเวอร์ชัน JDK หรือภาษา Java สำหรับบิลด์ในหลายตำแหน่ง
อภิธานศัพท์
- ชุดพัฒนาซอฟต์แวร์ 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 ตามลำดับต่อไปนี้
STUDIO_JDK
ตัวแปรสภาพแวดล้อม- ไดเรกทอรี
studio.jdk
(ในชุดการแจกจ่าย Android Studio) jbr
(รันไทม์ JetBrains) ในแพ็กเกจ 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 เวอร์ชันเดียวกัน การใช้โปรแกรมเดรัมซ้ำจะช่วยลดเวลาในการเริ่ม JVM ใหม่และเริ่มต้นระบบการบิลด์
หากคุณเริ่มการบิลด์ด้วย JDK หรือ Gradle เวอร์ชันอื่น ระบบจะสร้างเดรัมมอนเพิ่มเติม ซึ่งจะกิน CPU และหน่วยความจำมากขึ้น
การกําหนดค่า JDK ของ Gradle ใน 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
มาโครเหล่านี้เปิดใช้การเลือกเส้นทาง 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 มีคอมไพเลอร์ 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 ที่ใช้เมื่อสร้างไบต์โค้ดสำหรับซอร์สโค้ด 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 เสมอ