Memigrasikan konfigurasi build Anda dari Groovy ke Kotlin

Plugin Android Gradle 4.0 menambahkan dukungan untuk menggunakan Kotlin dalam konfigurasi build Gradle Anda sebagai pengganti Groovy, bahasa pemrograman yang secara tradisional digunakan dalam file konfigurasi Gradle.

Kotlin lebih disukai daripada Groovy untuk menulis skrip Gradle karena Kotlin lebih mudah dibaca dan menawarkan pemeriksaan waktu kompilasi dan dukungan IDE yang lebih baik.

Meskipun Kotlin saat ini menawarkan integrasi yang lebih baik di editor kode Android Studio jika dibandingkan dengan Groovy, build yang menggunakan Kotlin cenderung lebih lambat daripada build yang menggunakan Groovy, jadi pertimbangkan performa build saat memutuskan apakah akan bermigrasi.

Halaman ini memberikan informasi dasar tentang cara mengonversi file build Gradle aplikasi Android dari Groovy ke Kotlin. Untuk panduan migrasi yang lebih komprehensif, lihat dokumentasi resmi Gradle.

Linimasa

Mulai dari Android Studio Giraffe, project baru menggunakan DSL Kotlin (build.gradle.kts) secara default untuk konfigurasi build. Fitur ini menawarkan pengalaman pengeditan yang lebih baik daripada Groovy DSL (build.gradle) dengan penyorotan sintaksis, penyelesaian kode, dan navigasi ke deklarasi. Untuk mempelajari lebih lanjut, lihat Gradle Kotlin DSL Primer.

Istilah umum

Kotlin DSL: Lebih merujuk ke DSL Kotlin plugin Android Gradle atau, sesekali, ke DSL Kotlin Gradle yang digunakan.

Dalam panduan migrasi ini, "Kotlin" dan "Kotlin DSL" digunakan secara bergantian. Demikian juga, "Groovy" dan "Groovy DSL" digunakan secara bergantian.

Penamaan file skrip

Nama ekstensi file skrip didasarkan pada bahasa yang digunakan untuk menulis file build:

  • File build Gradle yang ditulis dalam Groovy menggunakan ekstensi nama file .gradle.
  • File build Gradle yang ditulis dalam Kotlin menggunakan ekstensi nama file .gradle.kts.

Mengonversi sintaksis

Ada beberapa perbedaan umum dalam sintaksis antara Groovy dan Kotlin, sehingga Anda perlu menerapkan perubahan ini di seluruh skrip build.

Menambahkan tanda kurung ke panggilan metode

Groovy memungkinkan Anda menghapus tanda kurung dalam panggilan metode, sedangkan Kotlin memerlukannya. Untuk memigrasikan konfigurasi Anda, tambahkan tanda kurung ke panggilan metode semacam ini. Kode ini menunjukkan cara mengonfigurasi setelan di Groovy:

compileSdkVersion 30

Kode ini sama dengan kode yang ditulis di Kotlin:

compileSdkVersion(30)

Menambahkan = ke panggilan tugas

Groovy DSL memungkinkan Anda menghilangkan operator penetapan = saat menetapkan properti, sedangkan Kotlin memerlukannya. Kode ini menunjukkan cara menetapkan properti di Groovy:

java {
    sourceCompatibility JavaVersion.VERSION_17
    targetCompatibility JavaVersion.VERSION_17
}

Kode ini menunjukkan cara menetapkan properti di Kotlin:

java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

Mengonversi string

Berikut adalah perbedaan string antara Groovy dan Kotlin:

  • Tanda petik ganda untuk string: Meskipun Groovy memungkinkan string ditentukan menggunakan tanda petik tunggal, Kotlin memerlukan tanda petik ganda.
  • Jenis interpolasi string pada ekspresi titik: Di Groovy, Anda hanya dapat menggunakan awalan $ untuk interpolasi string pada ekspresi titik-titik, tetapi Kotlin mengharuskan Anda menggabungkan ekspresi titik-titik dengan tanda kurung kurawal. Misalnya, di Groovy, Anda dapat menggunakan $project.rootDir seperti yang ditunjukkan dalam cuplikan berikut:

        myRootDirectory = "$project.rootDir/tools/proguard-rules-debug.pro"
        

    Namun, dalam Kotlin, kode sebelumnya memanggil toString() pada project, bukan pada project.rootDir. Untuk mendapatkan nilai direktori utama, gabungkan ekspresi ${project.rootDir} dengan tanda kurung kurawal:

        myRootDirectory = "${project.rootDir}/tools/proguard-rules-debug.pro"
        

    Untuk mempelajari lebih lanjut, lihat Template string dalam dokumentasi Kotlin.

Mengganti nama ekstensi file

Tambahkan .kts ke setiap file build saat Anda memigrasikan kontennya. Misalnya, pilih file build, seperti file settings.gradle. Ganti nama file menjadi settings.gradle.kts dan konversikan konten file ke Kotlin. Pastikan project Anda masih dikompilasi setelah migrasi setiap file build.

Migrasikan file terkecil Anda terlebih dahulu, dapatkan pengalaman, lalu lanjutkan. Anda dapat menggunakan campuran file build Kotlin dan Groovy dalam sebuah project, jadi luangkan waktu untuk berpindah dengan cermat.

Mengganti def dengan val atau var

Ganti def dengan val atau var, yang merupakan cara Anda menentukan variabel di Kotlin. Ini adalah deklarasi variabel di Groovy:

def building64Bit = false

Kode ini sama dengan kode yang ditulis di Kotlin:

val building64Bit = false

Mengawali properti boolean dengan is

Groovy menggunakan logika simpulan properti berdasarkan nama properti. Untuk properti boolean foo, metode yang dipotong dapat berupa getFoo, setFoo, atau isFoo. Jadi, setelah dikonversi ke Kotlin, Anda perlu mengubah nama properti menjadi metode yang disimpulkan yang tidak didukung oleh Kotlin. Misalnya, untuk elemen boolean DSL buildTypes, Anda harus mengawalinya dengan is. Kode ini menunjukkan cara menetapkan properti boolean di Groovy:

android {
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            ...
        }
        debug {
            debuggable true
            ...
        }
    ...

Berikut adalah kode yang sama di Kotlin. Perlu diperhatikan bahwa properti diawali dengan is.

android {
    buildTypes {
        getByName("release") {
            isMinifyEnabled = true
            isShrinkResources = true
            ...
        }
        getByName("debug") {
            isDebuggable = true
            ...
        }
    ...

Mengonversi daftar dan peta

Daftar dan peta dalam Groovy dan Kotlin ditentukan menggunakan sintaksis yang berbeda. Groovy menggunakan [], sedangkan Kotlin memanggil metode pembuatan koleksi secara eksplisit menggunakan listOf atau mapOf. Pastikan untuk mengganti [] dengan listOf atau mapOf saat memigrasikan.

Berikut cara menentukan daftar di Groovy versus Kotlin:

jvmOptions += ["-Xms4000m", "-Xmx4000m", "-XX:+HeapDumpOnOutOfMemoryError</code>"]

Kode ini sama dengan kode yang ditulis di Kotlin:

jvmOptions += listOf("-Xms4000m", "-Xmx4000m", "-XX:+HeapDumpOnOutOfMemoryError")

Berikut cara menentukan peta di Groovy versus Kotlin:

def myMap = [key1: 'value1', key2: 'value2']

Kode ini sama dengan kode yang ditulis di Kotlin:

val myMap = mapOf("key1" to "value1", "key2" to "value2")

Mengonfigurasi jenis build

Di DSL Kotlin, hanya jenis build rilis dan debug yang tersedia secara implisit. Semua jenis build kustom lainnya harus dibuat secara manual.

Di Groovy, Anda dapat menggunakan debug, rilis, dan jenis build tertentu lainnya tanpa membuatnya terlebih dahulu. Cuplikan kode berikut menunjukkan konfigurasi dengan jenis build debug, release, dan benchmark di Groovy.

buildTypes {
 debug {
   ...
 }
 release {
   ...
 }
 benchmark {
   ...
 }
}

Untuk membuat konfigurasi yang setara di Kotlin, Anda harus secara eksplisit membuat jenis build benchmark.

buildTypes {
 debug {
   ...
 }

 release {
   ...
 }
 register("benchmark") {
    ...
 }
}

Bermigrasi dari buildscript ke blok plugin

Jika build Anda menggunakan blok buildscript {} untuk menambahkan plugin ke project, Anda harus memfaktorkan ulang untuk menggunakan blok plugins {}. Blok plugins {} memudahkan penerapan plugin, dan berfungsi baik dengan katalog versi.

Selain itu, saat Anda menggunakan blok plugins {} di file build, Android Studio akan mengetahui konteksnya meskipun build gagal. Konteks ini membantu memperbaiki file DSL Kotlin Anda karena memungkinkan IDE Studio untuk melakukan penyelesaian kode dan memberikan saran bermanfaat lainnya.

Menemukan ID plugin

Meskipun blok buildscript {} menambahkan plugin ke classpath build menggunakan koordinat Maven dari plugin, misalnya com.android.tools.build:gradle:7.4.0, blok plugins {} menggunakan ID plugin.

Untuk sebagian besar plugin, ID plugin adalah string yang digunakan saat Anda menerapkannya menggunakan apply plugin. Misalnya, ID plugin berikut adalah bagian dari Plugin Android Gradle:

  • com.android.application
  • com.android.library
  • com.android.lint
  • com.android.test

Anda dapat menemukan daftar plugin lengkap di repositori Maven Google.

Plugin Kotlin dapat dirujuk oleh beberapa ID plugin. Sebaiknya gunakan ID plugin dengan namespace, dan faktorkan ulang dari singkatan ke ID plugin dengan namespace menggunakan tabel berikut:

ID plugin singkat ID plugin dengan namespace
kotlin org.jetbrains.kotlin.jvm
kotlin-android org.jetbrains.kotlin.android
kotlin-kapt org.jetbrains.kotlin.kapt
kotlin-parcelize org.jetbrains.kotlin.plugin.parcelize

Anda juga dapat menelusuri plugin di Portal Plugin Gradle, Maven Central Repository, dan repositori Google Maven. Baca Mengembangkan Plugin Gradle Kustom untuk mempelajari lebih lanjut cara kerja ID plugin.

Melakukan pemfaktoran ulang

Setelah mengetahui ID plugin yang Anda gunakan, lakukan langkah-langkah berikut:

  1. Jika Anda masih memiliki repositori untuk plugin yang dideklarasikan dalam blok buildscript {}, pindahkan saja ke file settings.gradle.

  2. Tambahkan plugin ke blok plugins {} di file build.gradle level atas. Anda perlu menentukan ID dan versi plugin di sini. Jika plugin tidak perlu diterapkan ke project root, gunakan apply false.

  3. Hapus entri classpath dari file build.gradle.kts tingkat atas.

  4. Terapkan plugin dengan menambahkannya ke blok plugins {} di file build.gradle level modul. Anda hanya perlu menentukan ID plugin di sini karena versi diwarisi dari project root.

  5. Hapus panggilan apply plugin untuk plugin dari file build.gradle level modul.

Misalnya, penyiapan ini menggunakan blok buildscript {}:

// Top-level build.gradle file
buildscript {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
    dependencies {
        classpath("com.android.tools.build:gradle:7.4.0")
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0")
        ...
    }
}

// Module-level build.gradle file
apply(plugin: "com.android.application")
apply(plugin: "kotlin-android")

Ini adalah penyiapan yang setara menggunakan blok plugins {}:

// Top-level build.gradle file
plugins {
   id 'com.android.application' version '7.4.0' apply false
   id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
   ...
}

// Module-level build.gradle file
plugins {
   id 'com.android.application'
   id 'org.jetbrains.kotlin.android'
   ...
}

// settings.gradle
pluginManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

Mengonversi blok plugin

Menerapkan plugin dari blok plugins {} serupa dalam Groovy dan Kotlin. Kode berikut menunjukkan cara menerapkan plugin di Groovy saat Anda menggunakan katalog versi:

// Top-level build.gradle file
plugins {
   alias libs.plugins.android.application apply false
   ...
}

// Module-level build.gradle file
plugins {
   alias libs.plugins.android.application
   ...
}

Kode berikut menunjukkan cara melakukan hal yang sama di Kotlin:

// Top-level build.gradle.kts file
plugins {
   alias(libs.plugins.android.application) apply false
   ...
}

// Module-level build.gradle.kts file
plugins {
   alias(libs.plugins.android.application)
   ...
}

Kode berikut menunjukkan cara menerapkan plugin di Groovy saat Anda tidak menggunakan katalog versi:

// Top-level build.gradle file
plugins {
   id 'com.android.application' version '7.3.0' apply false
   ...
}

// Module-level build.gradle file
plugins {
   id 'com.android.application'
   ...
}

Kode berikut menunjukkan cara melakukan hal yang sama di Kotlin:

// Top-level build.gradle.kts file
plugins {
   id("com.android.application") version "7.3.0" apply false
   ...
}

// Module-level build.gradle.kts file
plugins {
   id("com.android.application")
   ...
}

Untuk detail selengkapnya tentang blok plugins {}, lihat Menerapkan plugin dalam dokumentasi Gradle.

Lain-lain

Untuk mengetahui contoh kode Kotlin untuk fungsi lain, lihat halaman dokumentasi berikut:

Masalah umum

Saat ini, masalah yang sering terjadi adalah kecepatan build mungkin lebih lambat ketika menggunakan Kotlin daripada Groovy.

Cara melaporkan masalah

Untuk petunjuk tentang cara memberikan info yang kami butuhkan untuk melakukan triase masalah, lihat Detail untuk alat build dan bug Gradle. Selanjutnya, laporkan bug menggunakan issue tracker publik Google.

Referensi lainnya

Untuk mengetahui contoh kerja file build Gradle yang ditulis dengan Kotlin, lihat aplikasi contoh Now In Android di GitHub.