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 (Plugin Android Gradle 3.0.0+)
Untuk mulai menggunakan fitur bahasa Java 8 yang didukung:
- Update plugin Android Gradle ke versi 3.0.0 atau lebih tinggi.
- Untuk setiap modul yang menggunakan fitur bahasa
Java 8 (baik dalam kode sumbernya atau melalui dependensi),
update file
build.gradle
ataubuild.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
, danjava.util.OptionalDouble
) dan beberapa class baru - Beberapa tambahan pada
java.util.concurrent.atomic
(metode baru padaAtomicInteger
,AtomicLong
, danAtomicReference
) 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:
- Update plugin Android Gradle ke versi 4.0.0 (atau yang lebih tinggi).
- Sertakan baris berikut dalam file
build.gradle
ataubuild.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
.