Bergabunglah bersama kami di ⁠#Android11: The Beta Launch Show pada tanggal 3 Juni!

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 dalam gambar 2 (klik File > Project Structure).

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

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

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 yang kompatibel
Ekspresi lambda Semua. Perhatikan bahwa Android tidak mendukung serialisasi ekspresi lambda.
Referensi metode Semua.
Anotasi jenis Semua. Namun, informasi anotasi jenis tersedia pada waktu kompilasi, tidak pada saat waktu proses. 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 Semua.
Anotasi berulang Semua.
API Bahasa Java 8 minSdkVersion yang 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 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.

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 ini juga menyertakan dukungan untuk library pihak ketiga yang menggunakan fitur-fitur bahasa Java 8 dan dukungan untuk berbagai alat yang bergantung pada file .class antara.

Untuk menonaktifkan Jack dan beralih ke toolchain default, 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:

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

Dan hapus plugin Retrolambda serta blok retrolambda dari setiap file build.gradle 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 hal berikut ke file gradle.properties Anda:

android.enableDesugar=false
    

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