Memigrasikan konfigurasi build Anda dari Groovy ke Kotlin

Plugin Android Gradle 4.0 menambahkan dukungan untuk menggunakan Kotlin pada build Gradle Anda konfigurasi sebagai pengganti Groovy, bahasa pemrograman 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 saat ini Kotlin menawarkan integrasi yang lebih baik dalam kode Android Studio dibandingkan dengan Groovy, build yang menggunakan Kotlin cenderung lebih lambat daripada membangun aplikasi menggunakan Groovy, jadi pertimbangkan untuk membangun performa saat memutuskan apakah akan melakukan migrasi.

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

Linimasa

Mulai dari Android Studio Giraffe, project baru menggunakan DSL Kotlin (build.gradle.kts) secara default untuk konfigurasi build. Hal ini menawarkan pengalaman pengeditan selain Groovy DSL (build.gradle) dengan sintaksis penandaan, 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 "DSL Kotlin" 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 mengonversi konten file menjadi Kotlin. Pastikan project Anda masih dikompilasi setelah migrasi setiap file build.

Migrasikan file terkecil Anda terlebih dahulu, dapatkan pengalaman, lalu lanjutkan. Anda dapat memiliki campuran file build Kotlin dan Groovy dalam sebuah project, jadi luangkan waktu untuk bergerak dengan hati-hati.

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 potongan 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 buildscript {} untuk menambahkan plugin ke proyek, Anda harus memfaktorkan ulang untuk menggunakan plugins {} memblokir sebagai gantinya. Blok plugins {} memudahkan penerapan plugin, dan berfungsi baik dengan katalog versi.

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

Menemukan ID plugin

Sementara blok buildscript {} menambahkan plugin ke classpath build menggunakan tindakan Koordinat Maven plugin, misalnya com.android.tools.build:gradle:7.4.0, blok plugins {} menggunakan ID plugin sebagai gantinya.

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 namespaced, dan memfaktorkan ulang dari singkat menjadi ID plugin dengan namespace dengan 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 Maven Google. {i>Read<i} Mengembangkan Plugin Gradle Kustom untuk mempelajari lebih lanjut cara kerja ID plugin.

Melakukan pemfaktoran ulang

Setelah mengetahui ID plugin yang digunakan, lakukan langkah-langkah berikut:

  1. Jika Anda masih memiliki repositori untuk plugin yang dideklarasikan di buildscript {} blokir, pindahkan ke settings.gradle file tersebut.

  2. Tambahkan plugin ke blok plugins {} di tingkat teratas File build.gradle. Anda harus 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 level teratas.

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

  5. Menghapus panggilan apply plugin untuk plugin dari level modul File build.gradle.

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 di 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 umum adalah kecepatan build mungkin lebih lambat saat 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 melihat contoh kerja file build Gradle yang ditulis dengan Kotlin, lihat Aplikasi contoh Now In Android di GitHub.