ใช้ฟีเจอร์และ API สำหรับภาษาของ Java 8

ปลั๊กอิน 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"
    การเปลี่ยนรูปแบบ
รูปที่ 1 การสนับสนุนฟีเจอร์ภาษา Java 8 ที่ใช้ desugar การแปลงไบต์โค้ด

การสนับสนุนฟีเจอร์ภาษา Java 8 (ปลั๊กอิน Android Gradle 3.0.0 ขึ้นไป)

หากต้องการเริ่มต้นใช้ฟีเจอร์ภาษา Java 8 ที่รองรับ ให้ทำดังนี้

  1. อัปเดตปลั๊กอิน Android Gradle เป็นเวอร์ชัน 3.0.0 ขึ้นไป
  2. สำหรับแต่ละโมดูลที่ใช้ 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 ทุกเวอร์ชัน แพลตฟอร์ม:

  1. อัปเดตปลั๊กอิน Android Gradle เป็นเวอร์ชัน 4.0.0 (หรือสูงกว่า)
  2. ใส่ข้อมูลต่อไปนี้ลงในโมดูลแอป ไฟล์ 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