Versi Java dalam build Android

Baik kode sumber Anda ditulis dalam Java, Kotlin, atau keduanya, ada beberapa tempat Anda harus memilih versi bahasa JDK atau Java untuk build Anda.

Ringkasan hubungan JDK dalam build Gradle
Gambar 1. Hubungan JDK dalam build

Glosarium

Java Development Kit (JDK)
Java Development Kit (JDK) berisi:
  • Alat, seperti compiler, profiler, dan pembuat arsip. Alat ini digunakan di balik layar selama build untuk membuat aplikasi Anda.
  • Library yang berisi API yang dapat Anda panggil dari kode sumber Kotlin atau Java. Perhatikan bahwa tidak semua fungsi tersedia di Android.
  • Java Virtual Machine (JVM), penafsir yang mengeksekusi aplikasi Java. Anda menggunakan JVM untuk menjalankan Android Studio IDE dan alat build Gradle. JVM tidak digunakan di perangkat atau emulator Android.
JetBrains Runtime (JBR)
JetBrains Runtime (JBR) adalah JDK yang ditingkatkan, yang didistribusikan dengan Android Studio. JRE ini menyertakan beberapa pengoptimalan untuk digunakan di Studio dan produk JetBrains terkait, tetapi juga dapat digunakan untuk menjalankan aplikasi Java lainnya.

Bagaimana cara memilih JDK untuk menjalankan Android Studio?

Sebaiknya gunakan JBR untuk menjalankan Android Studio. JDK ini di-deploy dengan dan digunakan untuk menguji Android Studio, serta menyertakan peningkatan untuk penggunaan Android Studio yang optimal. Untuk memastikan hal ini, jangan tetapkan variabel lingkungan STUDIO_JDK.

Skrip startup untuk Android Studio mencari JVM dalam urutan berikut:

  1. Variabel lingkungan STUDIO_JDK
  2. Direktori studio.jdk (dalam distribusi Android Studio)
  3. Direktori jbr (JetBrains Runtime), dalam distribusi Android Studio. Direkomendasikan.
  4. Variabel lingkungan JDK_HOME
  5. Variabel lingkungan JAVA_HOME
  6. java yang dapat dieksekusi dalam variabel lingkungan PATH

Bagaimana cara memilih JDK yang menjalankan build Gradle saya?

Jika Anda menjalankan Gradle menggunakan tombol di Android Studio, JDK yang ditetapkan di setelan Android Studio akan digunakan untuk menjalankan Gradle. Jika Anda menjalankan Gradle di terminal, baik di dalam maupun di luar Android Studio, variabel lingkungan JAVA_HOME (jika ditetapkan) akan menentukan JDK yang menjalankan skrip Gradle. Jika JAVA_HOME tidak ditetapkan, perintah ini akan menggunakan perintah java pada variabel lingkungan PATH Anda.

Untuk hasil yang paling konsisten, pastikan Anda menetapkan variabel lingkungan JAVA_HOME, dan konfigurasi JDK Gradle di Android Studio ke JDK yang sama.

Saat menjalankan build, Gradle membuat proses yang disebut daemon untuk melakukan build yang sebenarnya. Proses ini dapat digunakan kembali, asalkan build menggunakan versi JDK dan Gradle yang sama. Menggunakan kembali daemon akan mengurangi waktu untuk memulai JVM baru dan melakukan inisialisasi sistem build.

Jika Anda memulai build dengan JDK atau versi Gradle yang berbeda, daemon tambahan akan dibuat, sehingga menggunakan lebih banyak CPU dan memori.

Konfigurasi JDK Gradle di Android Studio

Untuk mengubah konfigurasi JDK Gradle project yang ada, buka setelan Gradle dari File (atau Android Studio di macOS) > Settings > Build, Execution, Deployment > Build Tools > Gradle. Drop-down Gradle JDK berisi opsi berikut untuk dipilih:

  • Makro seperti JAVA_HOME dan GRADLE_LOCAL_JAVA_HOME
  • Entri tabel JDK dalam format vendor-version seperti jbr-17 yang disimpan dalam file konfigurasi Android
  • Mendownload JDK
  • Menambahkan JDK tertentu
  • JDK yang terdeteksi secara lokal dari direktori penginstalan JDK default sistem operasi

Opsi yang dipilih disimpan dalam opsi gradleJvm di file .idea/gradle.xml project, dan resolusi jalur JDK-nya digunakan untuk menjalankan Gradle saat dimulai melalui Android Studio.

Gambar 2. Setelan JDK Gradle di Android Studio.

Makro ini memungkinkan pemilihan jalur JDK project dinamis:

  • JAVA_HOME: menggunakan variabel lingkungan dengan nama yang sama
  • GRADLE_LOCAL_JAVA_HOME: menggunakan properti java.home dalam file .gradle/config.properties yang secara default menggunakan JetBrains Runtime.

JDK yang dipilih digunakan untuk menjalankan build Gradle dan me-resolve referensi API JDK saat mengedit skrip build dan kode sumber. Perhatikan bahwa compileSdk yang ditentukan akan lebih membatasi simbol Java yang akan tersedia saat mengedit dan mem-build kode sumber Anda.

Pastikan untuk memilih versi JDK yang lebih tinggi dari atau sama dengan versi JDK yang digunakan oleh plugin yang Anda gunakan dalam build Gradle. Untuk menentukan versi JDK minimum yang diperlukan untuk Plugin Android Gradle (AGP), lihat tabel kompatibilitas di catatan rilis.

Misalnya, Plugin Android Gradle versi 8.x memerlukan JDK 17. Jika Anda mencoba menjalankan build Gradle yang menggunakannya dengan versi JDK yang lebih lama, pesan seperti berikut akan dilaporkan:

An exception occurred applying plugin request [id: 'com.android.application']
> Failed to apply plugin 'com.android.internal.application'.
   > Android Gradle plugin requires Java 17 to run. You are currently using Java 11.
      Your current JDK is located in /usr/local/buildtools/java/jdk
      You can try some of the following options:
       - changing the IDE settings.
       - changing the JAVA_HOME environment variable.
       - changing `org.gradle.java.home` in `gradle.properties`.

Java API mana yang dapat saya gunakan dalam kode sumber Java atau Kotlin saya?

Aplikasi Android dapat menggunakan beberapa API yang ditentukan dalam JDK, tetapi tidak semuanya. Android SDK menentukan implementasi banyak fungsi library Java sebagai bagian dari API yang tersedia. Properti compileSdk menentukan versi Android SDK yang akan digunakan saat mengompilasi kode sumber Kotlin atau Java Anda.

Kotlin

android {
    ...
    compileSdk = 36
}

Groovy

android {
    ...
    compileSdk 36
}

Setiap versi Android mendukung versi JDK tertentu dan subset Java API yang tersedia. Jika Anda menggunakan Java API yang tersedia di compileSdk yang tidak tersedia di minSdk yang ditentukan, Anda mungkin dapat menggunakan API tersebut di Android versi sebelumnya melalui proses yang dikenal sebagai desugaring. Lihat API Java 11+ yang tersedia melalui desugaring untuk mengetahui API yang didukung.

Gunakan tabel ini untuk menentukan versi Java yang didukung oleh setiap Android API, dan tempat untuk menemukan detail tentang Java API yang tersedia.

Android Java Fitur API dan bahasa yang didukung
14 (API 34) 17 Library inti
13 (API 33) 11 Library inti
12 (API 32) 11 Java API
11 dan yang lebih lama Versi Android

JDK mana yang mengompilasi kode sumber Java saya?

JDK toolchain Java berisi compiler Java yang digunakan untuk mengompilasi kode sumber Java apa pun. JDK ini juga menjalankan javadoc dan pengujian unit selama build.

Toolchain ditetapkan secara default ke JDK yang digunakan untuk menjalankan Gradle. Jika Anda menggunakan setelan default dan menjalankan build di mesin yang berbeda (misalnya, mesin lokal dan server Continuous Integration terpisah), hasil build Anda dapat berbeda jika versi JDK yang digunakan berbeda.

Untuk membuat build yang lebih konsisten, Anda dapat secara eksplisit menentukan versi toolchain Java. Menentukan ini:

  • Menemukan JDK yang kompatibel pada sistem yang menjalankan build.
    • Jika tidak ada JDK yang kompatibel (dan resolver toolchain ditentukan), download satu.
  • Mengekspos Java API toolchain untuk panggilan dari kode sumber.
  • Mengompilasi sumber Java menggunakan versi bahasa Java-nya.
  • Menyediakan default untuk sourceCompatibility dan targetCompatibility.

Sebaiknya Anda selalu menentukan toolchain Java, dan memastikan bahwa JDK yang ditentukan telah diinstal, atau menambahkan toolchain resolver ke build Anda.

Anda dapat menentukan toolchain, baik kode sumber Anda ditulis dalam Java, Kotlin, atau keduanya. Tentukan toolchain di level teratas file build.gradle(.kts) modul Anda.

Tentukan versi toolchain Java seperti ini:

Kotlin

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

Groovy

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

Cara ini berfungsi jika sumber Anda adalah Kotlin, Java, atau campuran keduanya.

Versi JDK toolchain dapat sama dengan JDK yang digunakan untuk menjalankan Gradle, tetapi perlu diingat bahwa keduanya memiliki tujuan yang berbeda.

Fitur sumber bahasa Java mana yang dapat saya gunakan dalam kode sumber Java saya?

Properti sourceCompatibility menentukan fitur bahasa Java yang tersedia selama kompilasi sumber Java. Hal ini tidak memengaruhi sumber Kotlin.

Tentukan sourceCompatibility dalam file build.gradle(.kts) modul Anda sebagai berikut:

Kotlin

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
    }
}

Groovy

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
    }
}

Jika tidak ditentukan, properti ini akan ditetapkan secara default ke versi toolchain Java. Jika Anda tidak menggunakan toolchain Java, toolchain akan ditetapkan secara default ke versi yang dipilih oleh plugin Android Gradle (misalnya, Java 8 atau yang lebih tinggi).

Fitur biner Java mana yang dapat digunakan saat saya mengompilasi sumber Kotlin atau Java?

Properti targetCompatibility menentukan versi format class Java yang digunakan saat membuat bytecode untuk sumber Java dan Kotlin yang dikompilasi.

Beberapa fitur Kotlin sudah ada sebelum fitur Java yang setara ditambahkan. Compiler Kotlin awal harus membuat cara mereka sendiri untuk merepresentasikan fitur Kotlin tersebut. Beberapa fitur ini kemudian ditambahkan ke Java. Dengan level targetCompatibility yang lebih baru, compiler Kotlin dapat langsung menggunakan fitur Java, yang dapat menghasilkan performa yang lebih baik.

Versi Android yang berbeda mendukung versi Java yang berbeda. Anda dapat memanfaatkan fitur Java tambahan dengan meningkatkan targetCompatibility, tetapi hal ini mungkin memaksa Anda untuk juga meningkatkan versi Android SDK minimum untuk memastikan fitur tersebut tersedia.

Perhatikan bahwa targetCompatibility harus lebih besar dari atau sama dengan sourceCompatibility. Dalam praktiknya, sourceCompatibility dan targetCompatibility umumnya harus menggunakan nilai yang sama. Anda dapat menetapkannya sebagai berikut:

Kotlin

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
}

Groovy

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }
}

Jika Anda menggunakan versi Kotlin yang lebih rendah dari 2.2, Anda juga perlu menetapkan kotlinOptions:

Kotlin

android {
    kotlinOptions {
        jvmTarget = "17"
    }
}

Groovy

android {
    kotlinOptions {
        jvmTarget = "17"
    }
}

Jika tidak ditentukan, properti ini akan ditetapkan secara default ke versi toolchain Java. Jika Anda tidak menggunakan toolchain Java, nilai defaultnya mungkin berbeda dan menyebabkan masalah build. Oleh karena itu, sebaiknya Anda selalu menentukan nilai ini secara eksplisit atau menggunakan toolchain Java.