ปลั๊กอิน Android Gradle 3.0.0 ขึ้นไปรองรับฟีเจอร์ภาษา Java 7 ทั้งหมด และชุดย่อยของฟีเจอร์ภาษา Java 8 ที่แตกต่างกันไปตามเวอร์ชันของแพลตฟอร์ม วันและเวลา การสร้างแอปโดยใช้ปลั๊กอิน Android Gradle 4.0.0 ขึ้นไป API ภาษา Java 8 บางรายการโดยไม่ต้องมีระดับ API ขั้นต่ำสำหรับ แอป
หน้านี้จะอธิบายถึงคุณลักษณะภาษาของ Java 8 ที่คุณสามารถใช้ได้ และวิธี กำหนดค่าโปรเจ็กต์เพื่อใช้โปรเจ็กต์ดังกล่าว และปัญหาที่ทราบที่อาจพบ ดูภาพรวมฟีเจอร์ภาษาของ Java 8 ได้ในวิดีโอต่อไปนี้
ปลั๊กอิน Android Gradle มีการสนับสนุนในตัวสำหรับการใช้ Java 8 บางอย่าง
ฟีเจอร์ภาษาและไลบรารีของบุคคลที่สามที่ใช้ฟีเจอร์ดังกล่าว Toolchain เริ่มต้น
ใช้ฟีเจอร์ภาษาใหม่ด้วย
การแปลงไบต์โค้ด ที่เรียกว่า desugar
เป็นส่วนหนึ่งของการคอมไพล์ D8/R8
ลงในโค้ด DEX ดังที่แสดงในรูปที่ 1
![การสนับสนุนฟีเจอร์ภาษา Java 8 โดยใช้ไบต์โค้ด "desugar"
การเปลี่ยนรูปแบบ](https://developer.android.google.cn/static/studio/images/write/desugar_diagram.png?authuser=9&hl=th)
desugar
การแปลงไบต์โค้ด
การสนับสนุนฟีเจอร์ภาษา Java 8 (ปลั๊กอิน Android Gradle 3.0.0 ขึ้นไป)
หากต้องการเริ่มต้นใช้ฟีเจอร์ภาษา Java 8 ที่รองรับ ให้ทำดังนี้
- อัปเดตปลั๊กอิน Android Gradle เป็นเวอร์ชัน 3.0.0 ขึ้นไป
- สำหรับแต่ละโมดูลที่ใช้ Java 8
ฟีเจอร์ภาษา (ในซอร์สโค้ดหรือผ่านทรัพยากร Dependency)
อัปเดตไฟล์
build.gradle
หรือbuild.gradle.kts
ของโมดูลดังที่แสดงด้านล่าง
Kotlin
android { ... // Configure only for each module that uses Java 8 // language features (either in its source code or // through dependencies). compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } // For Kotlin projects kotlinOptions { jvmTarget = "1.8" } }
ดึงดูด
android { ... // Configure only for each module that uses Java 8 // language features (either in its source code or // through dependencies). compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } // For Kotlin projects kotlinOptions { jvmTarget = "1.8" } }
เมื่อคุณสร้างแอปโดยใช้ปลั๊กอิน Android Gradle 3.0.0 ขึ้นไป ปลั๊กอิน ไม่สนับสนุนฟีเจอร์ภาษา Java 8 ทั้งหมด ภาษาต่อไปนี้ พร้อมใช้งานใน API ทุกระดับ:
ฟีเจอร์ภาษา Java 8 | หมายเหตุ |
---|---|
นิพจน์ Lambda | Android ไม่สนับสนุนการเรียงลำดับ ด้วยสีหน้าของแลมบ์ดา |
ข้อมูลอ้างอิงเมธอด | |
ประเภทคำอธิบายประกอบ | ข้อมูลคำอธิบายประกอบประเภทจะพร้อมใช้งานในเวลาคอมไพล์เท่านั้น
ไม่ได้อยู่ที่รันไทม์ แพลตฟอร์มรองรับ
TYPE
ใน API ระดับ 24 หรือต่ำกว่า แต่ไม่ใช่ ElementType.TYPE_USE หรือ
ElementType.TYPE_PARAMETER
|
วิธีการอินเทอร์เฟซเริ่มต้นและแบบคงที่ | |
การใช้คำอธิบายประกอบซ้ำ |
นอกเหนือจากฟีเจอร์ภาษา Java 8 เหล่านี้แล้ว ปลั๊กอิน Android Gradle
เวอร์ชัน 3.0.0 ขึ้นไป ขยายการสนับสนุนสำหรับ
try
พร้อมทรัพยากรสำหรับ Android API ทุกระดับ
Desugar ไม่รองรับ
MethodHandle.invoke
หรือ
MethodHandle.invokeExact
หากซอร์สโค้ดหรือทรัพยากร Dependency ของโมดูลใช้วิธีใดวิธีหนึ่งต่อไปนี้
คุณต้องระบุ minSdkVersion 26
หรือสูงกว่า ไม่เช่นนั้น คุณจะได้รับ
ข้อผิดพลาดต่อไปนี้
Dex: Error converting bytecode to dex:
Cause: signature-polymorphic method called without --min-sdk-version >= 26
ในบางกรณี โมดูลของคุณอาจไม่ได้ใช้ invoke
หรือ invokeExact
แม้ว่าจะรวมอยู่ในทรัพยากร Dependency ของไลบรารีก็ตาม เพื่อใช้งานต่อไป
ไลบรารีนั้นที่มีราคาไม่เกิน minSdkVersion 25
เปิดใช้การย่อโค้ดเพื่อนำออก
เมธอดที่ไม่ได้ใช้ หากไม่ได้ผล ให้พิจารณาใช้ไลบรารีอื่นที่
ไม่ใช้วิธีการที่ไม่รองรับ
ภาษา Java 8+ มีฟีเจอร์การนำน้ำตาลไปใช้ใน Android Gradle
ปลั๊กอิน 3.0.0 ขึ้นไป และจะไม่สร้างคลาสและ API เพิ่มเติมใดๆ
(เช่น java.util.stream.*
) พร้อมใช้งานใน Android รุ่นที่เก่ากว่า
รองรับการลดน้ำตาล Java API บางส่วนได้จาก Android Gradle
ปลั๊กอิน 4.0.0 ขึ้นไป ตามที่อธิบายไว้ในส่วนต่อไปนี้
การสนับสนุนการลดน้ำตาล API สำหรับ Java 8+ (ปลั๊กอิน Android Gradle 4.0.0 ขึ้นไป)
หากคุณกำลังสร้างแอปโดยใช้ปลั๊กอิน Android Gradle 4.0.0 ขึ้นไป ปลั๊กอิน ได้ขยายการสนับสนุนสำหรับการใช้ API ของภาษา Java 8 จำนวนมาก ที่กำหนดระดับ API ขั้นต่ำสำหรับแอปของคุณ เมื่อใช้ปลั๊กอิน Android Gradle 7.4.0 หรือ มี API ภาษา Java 11 จำนวนหนึ่งที่สามารถใช้งานกับ ไลบรารี 2.0.0 ขึ้นไป
รองรับแพลตฟอร์มรุ่นเก่ากว่านี้เนื่องจากปลั๊กอิน
4.0.0 ขึ้นไปขยายเครื่องมือลดน้ำตาลให้เป็นภาษา Deugar Java ด้วย
API คุณสามารถรวม API ภาษามาตรฐานที่เคยใช้ได้เฉพาะใน
Android รุ่นล่าสุด (เช่น java.util.streams
) ในแอปที่รองรับรุ่นเก่ากว่า
เวอร์ชัน Android
ระบบรองรับชุด API ต่อไปนี้เมื่อสร้างแอปโดยใช้ Android ปลั๊กอิน Gradle 4.0.0 ขึ้นไป
- สตรีมตามลำดับ (
java.util.stream
) - ชุดย่อยของ
java.time
java.util.function
- สิ่งที่เพิ่มมาล่าสุดใน
java.util.{Map,Collection,Comparator}
- ไม่บังคับ (
java.util.Optional
,java.util.OptionalInt
และjava.util.OptionalDouble
) และชั้นเรียนใหม่บางส่วน - การเพิ่มบางส่วนใน
java.util.concurrent.atomic
(ใช้เมธอดใหม่AtomicInteger
,AtomicLong
และAtomicReference
) ConcurrentHashMap
(มีการแก้ไขข้อบกพร่องสำหรับ Android 5.0)
เมื่อใช้ปลั๊กอิน Android Gradle 7.4.0 ขึ้นไป Java 11 API เพิ่มเติม
เช่น แพ็กเกจ java.nio.file
ชุดย่อย
ดูรายการ API ทั้งหมดที่รองรับได้ที่ Java 8+ API พร้อมใช้งานผ่านกระบวนการย่อยน้ำตาล และ Java 11+ API พร้อมใช้งานผ่านการลดน้ำตาล
ปลั๊กอินจะรวมไฟล์ DEX แยกต่างหากเพื่อรองรับ API ภาษาเหล่านี้ ที่มีการใช้งาน API ที่ขาดหายไปและรวมไว้ในแอปของคุณ กระบวนการลดน้ำตาลจะเขียนโค้ดของแอปใหม่เพื่อใช้ไลบรารีนี้ที่ รันไทม์
หากต้องการให้รองรับ API ภาษาเหล่านี้ใน Android ทุกเวอร์ชัน แพลตฟอร์ม:
- อัปเดตปลั๊กอิน Android Gradle เป็นเวอร์ชัน 4.0.0 (หรือสูงกว่า)
- ใส่ข้อมูลต่อไปนี้ลงในโมดูลแอป
ไฟล์
build.gradle
หรือbuild.gradle.kts
:
Kotlin
android { defaultConfig { // Required when setting minSdkVersion to 20 or lower multiDexEnabled = true } compileOptions { // Flag to enable support for the new language APIs // For AGP 4.1+ isCoreLibraryDesugaringEnabled = true // For AGP 4.0 // coreLibraryDesugaringEnabled = true // Sets Java compatibility to Java 8 sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } } dependencies { // For AGP 7.4+ coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.3") // For AGP 7.3 // coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.2.3") // For AGP 4.0 to 7.2 // coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.9") }
ดึงดูด
android { defaultConfig { // Required when setting minSdkVersion to 20 or lower multiDexEnabled true } compileOptions { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true // Sets Java compatibility to Java 8 sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { // For AGP 7.4+ coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' // For AGP 7.3 // coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.3' // For AGP 4.0 to 7.2 // coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.9' }
โปรดทราบว่าคุณอาจต้องรวมข้อมูลโค้ดก่อนหน้าไว้ในไลบรารีด้วย
build.gradle
หรือ build.gradle.kts
ของโมดูล หากมีคุณสมบัติดังนี้
การทดสอบแบบมีเครื่องควบคุมของโมดูลไลบรารีจะใช้ API ภาษาเหล่านี้ ( โดยตรงหรือผ่านโมดูลไลบรารีหรือทรัพยากร Dependency ) ทั้งนี้เพื่อให้ มี API ที่ขาดหายไปสำหรับ APK การทดสอบแบบมีเครื่องดนตรีของคุณ
คุณต้องการเรียกใช้ Lint ในโมดูลไลบรารีแยกต่างหาก มีจุดประสงค์เพื่อช่วย Lint รับรู้การใช้งานที่ถูกต้องของ API ภาษาและหลีกเลี่ยงการรายงานข้อมูลที่เป็นเท็จ
นอกจากนี้ โปรดทราบว่าความสามารถในการลดน้ำตาล API สามารถใช้ร่วมกับการลดขนาดได้ แต่ เมื่อใช้เครื่องลดขนาด R8
เวอร์ชัน
ตารางต่อไปนี้แสดงเวอร์ชันของไลบรารี API ของ Java 8+ และเวอร์ชัน เวอร์ชันปลั๊กอิน Android Gradle ขั้นต่ำที่รองรับแต่ละเวอร์ชันมีดังนี้
เวอร์ชัน | เวอร์ชันปลั๊กอิน Android Gradle ขั้นต่ำ |
---|---|
1.1.9 | 4.0.0 |
1.2.3 | 7.3.0 |
2.0.3 | 7.4.0-alpha10 |
สำหรับรายละเอียดเกี่ยวกับเวอร์ชันของไลบรารี Java 8+ API โปรดดูที่
ไฟล์ CHANGELOG.md
ในที่เก็บ GitHub แบบ desugar_jdk_libs