Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Menggunakan fitur dan API bahasa Java 8

Plugin Android Gradle 3.0.0 dan yang terbaru, mendukung semua fitur bahasa Java 7 dan sebagian fitur bahasa Java 8 yang berbeda menurut versi platform. Saat membuat aplikasi menggunakan plugin Android Gradle 4.0.0 dan yang lebih tinggi, Anda dapat menggunakan sejumlah 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 juga video berikut untuk melihat ringkasan.

Catatan: Bila mengembangkan aplikasi untuk Android, penggunaan fitur bahasa Java 8 bersifat opsional. Anda boleh mempertahankan nilai kompatibilitas sumber dan target project yang Anda tetapkan ke Java 7, tetapi Anda tetap harus melakukan kompilasi menggunakan JDK 8.

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

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

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

Untuk mulai menggunakan fitur bahasa Java 8 yang didukung, update plugin Android ke versi 3.0.0 (atau lebih tinggi). Setelah itu, untuk setiap modul yang menggunakan fitur bahasa Java 8 (entah dalam kode sumbernya atau melalui dependensi), update file build.gradle modul, seperti yang ditunjukkan berikut ini:

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 membuat aplikasi menggunakan plugin Android Gradle 3.0.0 dan yang lebih tinggi, plugin tersebut tidak mendukung semua fitur bahasa Java 8. Fitur bahasa berikut untuk saat ini tersedia pada API level mana pun:

Fitur bahasa Java 8 Catatan
Ekspresi lambda Perhatikan bahwa Android tidak mendukung serialisasi ekspresi lambda.
Referensi metode  
Anotasi jenis Informasi anotasi jenis hanya tersedia saat mengompilasi, dan tidak saat runtime. Platform ini juga mendukung TYPE di API level 24 dan yang lebih rendah, tetapi tidak ElementType.TYPE_USE atau ElementType.TYPE_PARAMETER.
Metode antarmuka default dan statis  
Anotasi berulang  

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

Desugar saat ini tidak mendukung MethodHandle.invoke atau MethodHandle.invokeExact. Jika kode sumber Anda atau salah satu dependensi modulAnda menggunakan salah satu metode ini, Anda perlu menentukan minSdkVersion 26 atau yang lebih tinggi. Jika tidak, Anda akan mendapatkan 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. Jadi, 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+ yang tersedia dari Plugin Android Gradle 3.0.0 tidak menyediakan class dan API tambahan (seperti java.util.stream.*) untuk penggunaan pada rilis Android seri lama. Dukungan untuk desugaring API Java sebagian tersedia dari Plugin Android Gradle 4.0.0 atau yang lebih tinggi dan diuraikan dalam bagian berikut.

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

Jika Anda membuat 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 API level minimum untuk aplikasi Anda.

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. Jadi, 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}
  • Optional (java.util.Optional, java.util.OptionalInt dan java.util.OptionalDouble) beberapa class baru lainnya yang berguna dengan API di atas
  • Beberapa tambahan pada java.util.concurrent.atomic (metode baru pada AtomicInteger, AtomicLong dan AtomicReference)
  • ConcurrentHashMap (dengan perbaikan bug untuk Android 5.0)

Untuk mengetahui daftar lengkap API yang didukung, kunjungi API Java 8+ yang tersedia melalui desugaring.

Guna mendukung API bahasa ini, plugin tersebut mengompilasi file DEX terpisah yang berisi penerapan API yang hilang lalu menyertakannya dalam aplikasi Anda. Proses desugaring menulis ulang kode aplikasi Anda supaya menggunakan library ini pada saat runtime.

Guna mengaktifkan dukungan untuk API bahasa ini pada versi platform Android mana pun, update plugin Android menjadi 4.0.0 (atau yang lebih tinggi) dan sertakan hal berikut dalam file build.gradle modul Anda:

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 {
  coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9'
}