Menggunakan fitur dan API bahasa Java 8

Plugin Android Gradle 3.0.0 dan yang lebih baru mendukung semua fitur bahasa Java 7 dan subset fitur bahasa Java 8 yang berbeda menurut versi platform. Saat mem-build aplikasi menggunakan plugin Android Gradle 4.0.0 dan yang lebih tinggi, Anda dapat menggunakan beberapa API bahasa Java 8 tanpa memerlukan API level minimum untuk aplikasi Anda.

Halaman ini menjelaskan fitur bahasa Java 8 yang dapat Anda gunakan, cara mengonfigurasi project Anda dengan tepat untuk menggunakannya, dan masalah umum yang mungkin Anda temukan. Lihat video berikut untuk ringkasan fitur bahasa Java 8.

Plugin Android Gradle menyediakan dukungan bawaan untuk menggunakan fitur bahasa Java 8 tertentu dan library pihak ketiga yang menggunakannya. Toolchain default mengimplementasikan fitur bahasa baru dengan menjalankan transformasi bytecode, yang disebut desugar, sebagai bagian dari kompilasi file class D8/R8 menjadi kode DEX, seperti ditunjukkan dalam gambar 1.

Dukungan fitur bahasa Java 8 menggunakan transformasi bytecode
    `desugar`.
Gambar 1. Dukungan fitur bahasa Java 8 menggunakan transformasi bytecode desugar.

Dukungan fitur bahasa Java 8 (Plugin Android Gradle 3.0.0+)

Untuk mulai menggunakan fitur bahasa Java 8 yang didukung:

  1. Update plugin Android Gradle ke versi 3.0.0 atau lebih tinggi.
  2. Untuk setiap modul yang menggunakan fitur bahasa Java 8 (baik dalam kode sumbernya atau melalui dependensi), update file build.gradle atau build.gradle.kts modul seperti ditunjukkan di bawah ini:

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"
    }
}

Groovy

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"
    }
}

Saat mem-build aplikasi menggunakan plugin Android Gradle 3.0.0 dan yang lebh tinggi, plugin tidak mendukung semua fitur bahasa Java 8. Fitur bahasa berikut tersedia pada API level mana pun:

Fitur bahasa Java 8 Catatan
Ekspresi lambda Android tidak mendukung serialisasi ekspresi lambda.
Referensi metode  
Anotasi Type Informasi anotasi Type hanya tersedia pada waktu kompilasi, bukan pada runtime. Platform ini juga mendukung TYPE di API level 24 dan yang lebih lama, tetapi tidak ElementType.TYPE_USE atau ElementType.TYPE_PARAMETER.
Metode antarmuka default dan statis  
Anotasi berulang  

Selain fitur bahasa Java 8 ini, plugin Android Gradle versi 3.0.0 dan yang lebih tinggi memperluas dukungan untuk try-with-resources ke semua API level Android.

Desugar tidak mendukung MethodHandle.invoke atau MethodHandle.invokeExact. Jika kode sumber Anda atau salah satu dependensi modul Anda menggunakan salah satu metode ini, Anda perlu menentukan minSdkVersion 26 atau yang lebih tinggi. Jika tidak, Anda akan menerima error berikut:

Dex: Error converting bytecode to dex:
Cause: signature-polymorphic method called without --min-sdk-version >= 26

Pada beberapa kasus, modul Anda mungkin tidak menggunakan metode invoke atau invokeExact sekalipun metode tersebut disertakan dalam dependensi library. Untuk terus menggunakan library tersebut dengan minSdkVersion 25 atau yang lebih rendah, aktifkan penyingkatan kode untuk menghapus metode yang tidak digunakan. Jika tidak berhasil, pertimbangkan menggunakan library alternatif yang tidak menggunakan metode yang tidak didukung.

Desugaring fitur bahasa Java 8+ pada plugin Android Gradle 3.0.0 dan yang lebih tinggi tidak menyediakan class dan API tambahan (seperti java.util.stream.*) untuk penggunaan pada rilis Android versi lama. Dukungan untuk desugaring API Java parsial tersedia dari plugin Android Gradle 4.0.0 atau yang lebih tinggi, seperti dijelaskan di bagian berikut.

Dukungan desugaring API Java 8+ (Plugin Android Gradle 4.0.0+)

Jika Anda membangun aplikasi menggunakan plugin Android Gradle 4.0.0 atau yang lebih tinggi, plugin tersebut akan memperluas dukungan untuk penggunaan sejumlah API bahasa Java 8 tanpa memerlukan level API minimum untuk aplikasi Anda. Dengan plugin Android Gradle 7.4.0 atau yang lebih tinggi, sejumlah API bahasa Java 11 juga tersedia dengan library desugaring 2.0.0 atau yang lebih tinggi.

Dukungan tambahan untuk versi platform lama ini bisa saja diterapkan karena plugin 4.0.0 dan yang lebih tinggi memperluas mesin desugaring supaya juga men-desugar API bahasa Java. Anda dapat menyertakan API bahasa standar yang hanya tersedia di rilis Android terbaru (seperti java.util.streams) pada aplikasi yang mendukung versi Android lama.

Kumpulan API berikut didukung saat membuat aplikasi menggunakan plugin Android Gradle 4.0.0 atau yang lebih tinggi:

  • Stream berurutan (java.util.stream)
  • Subset java.time
  • java.util.function
  • Penambahan terbaru pada java.util.{Map,Collection,Comparator}
  • Opsional (java.util.Optional, java.util.OptionalInt, dan java.util.OptionalDouble) dan beberapa class baru
  • Beberapa tambahan pada java.util.concurrent.atomic (metode baru pada AtomicInteger, AtomicLong, dan AtomicReference)
  • ConcurrentHashMap (dengan perbaikan bug untuk Android 5.0)

Dengan plugin Android Gradle 7.4.0 atau yang lebih tinggi, API Java 11 tambahan didukung seperti subset paket java.nio.file.

Untuk mengetahui daftar lengkap API yang didukung, buka API Java 8+ yang tersedia melalui desugaring dan API Java 11+ yang tersedia melalui desugaring.

Untuk mendukung API bahasa ini, plugin mengompilasi file DEX terpisah yang berisi implementasi API yang tidak ada dan menyertakannya di aplikasi. Proses desugaring menulis ulang kode aplikasi untuk menggunakan library ini pada waktu proses.

Guna mengaktifkan dukungan untuk API bahasa ini pada versi platform Android apa pun:

  1. Update plugin Android Gradle ke versi 4.0.0 (atau yang lebih tinggi).
  2. Sertakan baris berikut dalam file build.gradle atau build.gradle.kts modul aplikasi Anda:

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")
}

Groovy

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'
}

Perhatikan bahwa Anda mungkin juga perlu menyertakan cuplikan kode sebelumnya dalam file build.gradle atau build.gradle.kts modul library jika:

  • Uji instrumentasi modul library menggunakan API bahasa ini (baik secara langsung, melalui modul library, maupun dependensinya). Hal ini dilakukan agar API yang tidak ada disediakan untuk APK uji instrumentasi Anda.

  • Anda ingin menjalankan lint di modul library secara terpisah. Hal ini untuk membantu lint mengenali penggunaan valid dari API bahasa dan menghindari pelaporan peringatan palsu.

Perhatikan juga bahwa desugaring API dapat digabungkan dengan penyingkatan, tetapi hanya jika menggunakan penyingkat R8.

Versi

Tabel berikut menunjukkan versi library API Java 8+ dan versi plugin Android Gradle minimum yang mendukung setiap versi:

Versi Versi plugin Android Gradle minimum
1.1.9 4.0.0
1.2.3 7.3.0
2.0.3 7.4.0-alpha10

Untuk mengetahui detail tentang versi library API Java 8+, lihat file CHANGELOG.md di repositori GitHub desugar_jdk_libs.