Menggunakan fitur bahasa Java 8

Android Studio 3.0 dan yang lebih baru mendukung semua fitur bahasa Java 7 dan sebagian fitur bahasa Java 8 yang berbeda menurut versi platform. Halaman ini menjelaskan fitur bahasa Java 8 yang dapat Anda digunakan, 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.

Android Studio 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, pada output compiler javac. Jack tidak lagi didukung, dan Anda harus terlebih dahulu menonaktifkan Jack untuk menggunakan dukungan Java 8 yang tertanam dalam toolchain default.

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

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 Source Compatibility dan Target Compatibility ke 1.8 dalam dialog Project Structure seperti yang ditunjukkan pada gambar 2 (klik File > Project Structure).

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

Anda juga dapat mengonfigurasinya langsung dalam file build.gradle yang terkait:

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

Catatan: Jika Android Studio mendeteksi bahwa project Anda menggunakan Jack, Retrolambda, atau DexGuard, IDE akan menggunakan dukungan Java 8 yang disediakan oleh fitur-fitur tersebut. Namun, pertimbangkan untuk melakukan migrasi ke toolchain default.

Fitur dan API bahasa Java 8 yang Didukung

Tidak semua fitur bahasa Java 8 didukung Android Studio, tetapi semakin banyak fitur yang ditambahkan ke dalam rilis IDE mendatang. Bergantung pada minSdkVersion yang Anda gunakan, fitur dan API tertentu kini tersedia, seperti dijelaskan pada tabel di bawah.

Fitur bahasa Java 8 minSdkVersion kompatibel
Ekspresi lambda Semua. Perhatikan bahwa Android tidak mendukung serialisasi ekspresi lambda.
Referensi metode Semua.
Anotasi Type Semua. Namun, informasi anotasi type tersedia pada waktu kompilasi, tidak pada saat runtime. Selain itu, platform mendukung TYPE pada API level 24 dan yang lebih rendah, tetapi tidak mendukung ElementType.TYPE_USE atau ElementType.TYPE_PARAMETER.
Metode antarmuka default dan statis Semua.
Anotasi berulang Semua.
API Bahasa Java 8 minSdkVersion kompatibel
java.lang.annotation.Repeatable API level 17 atau lebih tinggi.
AnnotatedElement.getAnnotationsByType(Class) API level 17 atau lebih tinggi.
java.util.stream API level 17 atau lebih tinggi.
java.lang.FunctionalInterface API level 17 atau lebih tinggi.
java.lang.reflect.Method.isDefault() API level 17 atau lebih tinggi.
java.util.function API level 17 atau lebih tinggi.

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

Desugar saat ini 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 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 dengan minSdkVersion 25 atau yang lebih rendah, aktifkan penyusutan kode untuk menghapus metode yang tidak digunakan. Jika tidak berhasil, pertimbangkan menggunakan library alternatif yang tidak menggunakan metode yang tidak didukung.

Bermigrasi ke toolchain default

Jika Android Studio mendeteksi bahwa project Anda menggunakan Jack, Retrolambda, atau DexGuard, IDE akan menggunakan dukungan Java 8 yang disediakan oleh fitur-fitur tersebut. Akan tetapi, dibanding toolchain default, fitur tersebut tidak memiliki beberapa fungsionalitas dan dukungan. Jadi, ikutilah petunjuk di bagian ini untuk melakukan migrasi ke toolchain default Android Studio.

Melakukan migrasi dari Jack

Toolchain Jack tidak digunakan lagi sejak dikeluarkannya pengumuman ini. Jika project Anda bergantung pada Jack, Anda harus bermigrasi ke menggunakan dukungan Java 8 yang tertanam dalam toolchain default Android Studio. Toolchain default juga menyertakan dukungan untuk library pihak ketiga yang menggunakan fitur bahasa Java 8, Instant Run, dan fitur yang bergantung pada file .class antara.

Untuk menonaktifkan Jack dan beralih ke toolchain default, cukup hapus blok jackOptions dari file build.gradle modul Anda:

android {
        ...
        defaultConfig {
            ...
            // Remove this block.
            jackOptions {
                enabled true
                ...
            }
        }

        // Keep the following configuration in order to target Java 8.
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
        // For Kotlin projects
        kotlinOptions {
            jvmTarget = "1.8"
        }
    }
    

Melakukan migrasi dari Retrolambda

Dibanding toolchain default Android Studio, Retrolambda tidak memiliki dukungan untuk library pihak ketiga yang menggunakan fitur bahasa Java 8. Untuk bermigrasi ke toolchain default, hapus dependensi Retrolambda dari file build.gradle level project Anda:

buildscript {
      ...
       dependencies {
          // Remove the following dependency.
          classpath 'me.tatarka:gradle-retrolambda:<version_number>'
       }
    }
    

Hapus juga plugin Retrolambda dan blok retrolambda dari file build.gradle setiap modul:

    // Remove the following plugin.
    apply plugin: 'me.tatarka.retrolambda'
    ...
    // Remove this block after migrating useful configurations.
    retrolambda {
        ...
        // If you have arguments for the Java VM you want to keep,
        // move them to your project's gradle.properties file.
        jvmArgs '-Xmx2048m'
    }
    

Menonaktifkan dukungan untuk fitur bahasa Java 8

Jika ada masalah yang terkait dengan dukungan untuk fitur bahasa Java 8, Anda dapat menonaktifkannya dengan menambahkan baris berikut ke file gradle.properties Anda:

android.enableDesugar=false
    

Guna membantu kami menyempurnakan dukungan untuk Java 8, harap laporkan bug.