ปลั๊กอิน Android Gradle 4.0 เพิ่มการรองรับการใช้ Kotlin ในการกำหนดค่าบิลด์ Gradle เพื่อแทนที่ Groovy ซึ่งเป็นภาษาโปรแกรมที่ใช้กันมาแต่เดิมในไฟล์การกำหนดค่า Gradle
เราขอแนะนำให้ใช้ Kotlin มากกว่า Groovy ในการเขียนสคริปต์ Gradle เนื่องจาก Kotlin อ่านง่ายกว่า รวมถึงมีการตรวจสอบเวลาคอมไพล์และการรองรับ IDE ที่ดีกว่า
แม้ว่าปัจจุบัน Kotlin จะมีการผสานรวมที่ดีกว่าในตัวแก้ไขโค้ดของ Android Studio เมื่อเทียบกับ Groovy แต่บิลด์ที่ใช้ Kotlin มักจะช้ากว่าบิลด์ที่ใช้ Groovy ดังนั้นโปรดพิจารณาประสิทธิภาพของบิลด์เมื่อตัดสินใจว่าจะย้ายข้อมูลหรือไม่
หน้านี้ให้ข้อมูลพื้นฐานเกี่ยวกับการแปลงไฟล์บิลด์ Gradle ของแอป Android จาก Groovy เป็น Kotlin ดูคำแนะนำในการย้ายข้อมูลที่ครอบคลุมมากขึ้นได้ที่เอกสารประกอบอย่างเป็นทางการของ Gradle
ไทม์ไลน์
ตั้งแต่ Android Studio Giraffe เป็นต้นไป โปรเจ็กต์ใหม่จะใช้ Kotlin DSL (build.gradle.kts) โดยค่าเริ่มต้นสำหรับการกำหนดค่าบิลด์ ซึ่งจะมอบประสบการณ์การแก้ไขที่ดีกว่า Groovy DSL (build.gradle) ด้วยการไฮไลต์ไวยากรณ์ การเติมโค้ดให้สมบูรณ์ และการไปยังส่วนต่างๆ ของการประกาศ ดูข้อมูลเพิ่มเติมได้ที่คู่มือเบื้องต้นเกี่ยวกับ Gradle Kotlin DSL
คำศัพท์ที่พบบ่อย
Kotlin DSL: หมายถึง Kotlin DSL ของปลั๊กอิน Android Gradle เป็นหลัก หรือบางครั้งอาจหมายถึง Kotlin DSL ของ Gradle ที่สำคัญ
ในคำแนะนำในการย้ายข้อมูลนี้ "Kotlin" และ "Kotlin DSL" จะใช้แทนกันได้ ในทำนองเดียวกัน "Groovy" และ "Groovy DSL" จะใช้แทนกันได้
การตั้งชื่อไฟล์สคริปต์
ชื่อนามสกุลไฟล์สคริปต์จะอิงตามภาษาที่ใช้เขียนไฟล์บิลด์ ดังนี้
- ไฟล์บิลด์ Gradle ที่เขียนด้วย Groovy จะใช้นามสกุลไฟล์
.gradle - ไฟล์บิลด์ Gradle ที่เขียนด้วย Kotlin จะใช้นามสกุลไฟล์
.gradle.kts
แปลงไวยากรณ์
ไวยากรณ์ของ Groovy และ Kotlin มีความแตกต่างกันโดยทั่วไป ดังนั้นคุณจึงต้องใช้การเปลี่ยนแปลงเหล่านี้กับสคริปต์บิลด์ทั้งหมด
เพิ่มวงเล็บในการเรียกใช้เมธอด
Groovy ช่วยให้คุณละเว้นวงเล็บในการเรียกใช้เมธอดได้ ส่วน Kotlin กำหนดให้ต้องมีวงเล็บ หากต้องการย้ายข้อมูลการกำหนดค่า ให้เพิ่มวงเล็บให้กับการเรียกใช้เมธอดประเภทนี้ โค้ดนี้แสดงวิธีกำหนดการตั้งค่าใน Groovy
compileSdkVersion 30
โค้ดเดียวกันนี้เขียนใน Kotlin ได้ดังนี้
compileSdkVersion(30)
เพิ่ม = ในการเรียกการกำหนดค่า
Groovy DSL ช่วยให้คุณละโอเปอเรเตอร์การกำหนด = ได้เมื่อกำหนดพร็อพเพอร์ตี้ แต่ Kotlin กำหนดให้ต้องใช้ โค้ดนี้แสดงวิธีกำหนดพร็อพเพอร์ตี้ใน Groovy
java {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
โค้ดนี้แสดงวิธีกำหนดพร็อพเพอร์ตี้ใน Kotlin
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
แปลงสตริง
ความแตกต่างของสตริงระหว่าง Groovy กับ Kotlin มีดังนี้
เครื่องหมายคำพูดคู่สำหรับสตริง: แม้ว่า Groovy จะอนุญาตให้กำหนดสตริงโดยใช้เครื่องหมายคำพูดเดี่ยว แต่ Kotlin ต้องใช้เครื่องหมายคำพูดคู่
การแทรกสตริงในนิพจน์ที่มีจุด: ใน Groovy คุณสามารถใช้เพียงคำนำหน้า
$สำหรับการแทรกสตริงในนิพจน์ที่มีจุด แต่ Kotlin กำหนดให้คุณต้องรวมนิพจน์ที่มีจุดไว้ในวงเล็บปีกกา เช่น ใน Groovy คุณสามารถใช้$project.rootDirดังที่แสดงในข้อมูลโค้ดต่อไปนี้myRootDirectory = "$project.rootDir/tools/proguard-rules-debug.pro"แต่ใน Kotlin โค้ดก่อนหน้าจะเรียกใช้
toString()บนprojectไม่ใช่บนproject.rootDirหากต้องการรับค่าของไดเรกทอรีราก ให้ใส่นิพจน์${project.rootDir}ไว้ในวงเล็บปีกกาmyRootDirectory = "${project.rootDir}/tools/proguard-rules-debug.pro"ดูข้อมูลเพิ่มเติมได้ที่เทมเพลตสตริงในเอกสารประกอบของ Kotlin
เปลี่ยนชื่อนามสกุลไฟล์
เพิ่ม .kts ต่อท้ายไฟล์บิลด์แต่ละไฟล์เมื่อคุณย้ายข้อมูลเนื้อหา เช่น เลือกไฟล์บิลด์ เช่น ไฟล์ settings.gradle เปลี่ยนชื่อไฟล์เป็น settings.gradle.kts และแปลงเนื้อหาของไฟล์เป็น Kotlin ตรวจสอบว่าโปรเจ็กต์ยังคงคอมไพล์ได้หลังจากการย้ายข้อมูลไฟล์บิลด์แต่ละไฟล์
ย้ายข้อมูลไฟล์ขนาดเล็กที่สุดก่อนเพื่อรับประสบการณ์ แล้วจึงค่อยย้ายข้อมูลไฟล์อื่นๆ คุณสามารถมีไฟล์บิลด์ Kotlin และ Groovy ผสมกันในโปรเจ็กต์ได้ ดังนั้นโปรดใช้เวลาในการย้ายอย่างรอบคอบ
แทนที่ def ด้วย val หรือ var
แทนที่ def ด้วย val หรือ var ซึ่งเป็นวิธีกำหนดตัวแปรใน Kotlin
ตัวอย่างการประกาศตัวแปรใน Groovy
def building64Bit = false
โค้ดเดียวกันนี้เขียนใน Kotlin ได้ดังนี้
val building64Bit = false
ใช้ is เป็นคำนำหน้าพร็อพเพอร์ตี้บูลีน
Groovy ใช้ตรรกะการหักลบพร็อพเพอร์ตี้ตามชื่อพร็อพเพอร์ตี้ สำหรับพร็อพเพอร์ตี้บูลีน foo เมธอดที่อนุมานอาจเป็น getFoo, setFoo หรือ isFoo ดังนั้นเมื่อแปลงเป็น Kotlin แล้ว คุณต้องเปลี่ยนชื่อพร็อพเพอร์ตี้เป็นเมธอดที่อนุมานซึ่ง Kotlin ไม่รองรับ เช่น สำหรับองค์ประกอบบูลีน DSL buildTypes คุณต้องใส่ is ไว้ข้างหน้า โค้ดนี้แสดงวิธีตั้งค่าพร็อพเพอร์ตี้บูลีนใน Groovy
android {
buildTypes {
release {
minifyEnabled true
shrinkResources true
...
}
debug {
debuggable true
...
}
...
โค้ดต่อไปนี้เป็นโค้ดเดียวกันใน Kotlin โปรดทราบว่าพร็อพเพอร์ตี้จะมีคำนำหน้าเป็น is
android {
buildTypes {
getByName("release") {
isMinifyEnabled = true
isShrinkResources = true
...
}
getByName("debug") {
isDebuggable = true
...
}
...
แปลงรายการและการแมป
รายการและการแมปใน Groovy และ Kotlin จะกำหนดโดยใช้ไวยากรณ์ที่แตกต่างกัน Groovy
ใช้ [] ส่วน Kotlin จะเรียกใช้เมธอดการสร้างคอลเล็กชันอย่างชัดเจนโดยใช้
listOf หรือ mapOf โปรดตรวจสอบว่าได้แทนที่ [] ด้วย listOf หรือ mapOf เมื่อ
ย้ายข้อมูล
วิธีกำหนดรายการใน Groovy กับ Kotlin มีดังนี้
jvmOptions += ["-Xms4000m", "-Xmx4000m", "-XX:+HeapDumpOnOutOfMemoryError</code>"]
โค้ดเดียวกันนี้เขียนใน Kotlin ได้ดังนี้
jvmOptions += listOf("-Xms4000m", "-Xmx4000m", "-XX:+HeapDumpOnOutOfMemoryError")
วิธีกำหนดการแมปใน Groovy กับ Kotlin มีดังนี้
def myMap = [key1: 'value1', key2: 'value2']
โค้ดเดียวกันนี้เขียนใน Kotlin ได้ดังนี้
val myMap = mapOf("key1" to "value1", "key2" to "value2")
กำหนดค่าประเภทบิลด์
ใน Kotlin DSL จะมีเฉพาะบิลด์ประเภทการแก้ไขข้อบกพร่องและการเผยแพร่เท่านั้น โดยปริยาย ส่วนบิลด์ประเภทอื่นๆ ที่กำหนดเองจะต้องสร้างด้วยตนเอง
ใน Groovy คุณสามารถใช้บิลด์ประเภทการแก้ไขข้อบกพร่อง การเผยแพร่ และบิลด์อื่นๆ บางประเภทได้โดยไม่ต้องสร้างก่อน ข้อมูลโค้ดต่อไปนี้แสดงการกำหนดค่าที่มีประเภทบิลด์
debug, release และ
benchmark
ใน Groovy
buildTypes {
debug {
...
}
release {
...
}
benchmark {
...
}
}
หากต้องการสร้างการกำหนดค่าที่เทียบเท่าใน Kotlin คุณต้องสร้างประเภทบิลด์ benchmark อย่างชัดเจน
buildTypes {
debug {
...
}
release {
...
}
register("benchmark") {
...
}
}
ย้ายข้อมูลจาก buildscript ไปยังบล็อก plugins
หากบิลด์ใช้บล็อก
buildscript {}
เพื่อเพิ่มปลั๊กอินลงในโปรเจ็กต์ คุณควรเปลี่ยนโครงสร้างภายในโค้ดเพื่อใช้บล็อก
plugins {}
แทน บล็อก plugins {} นี้ช่วยให้ใช้ปลั๊กอินได้ง่ายขึ้น และทำงานร่วมกับแคตตาล็อกเวอร์ชันได้เป็นอย่างดี
นอกจากนี้ เมื่อคุณใช้บล็อก plugins {} ในไฟล์บิลด์ Android Studio จะทราบถึงบริบทแม้ว่าบิลด์จะล้มเหลวก็ตาม บริบทนี้ช่วยแก้ไขไฟล์ Kotlin DSL เนื่องจากช่วยให้ Studio IDE ทำการเติมโค้ดให้สมบูรณ์และให้คำแนะนำที่เป็นประโยชน์อื่นๆ ได้
ค้นหารหัสปลั๊กอิน
ขณะที่บล็อก buildscript {} เพิ่มปลั๊กอินลงในคลาสพาธของบิลด์โดยใช้พิกัด Maven ของปลั๊กอิน เช่น com.android.tools.build:gradle:7.4.0 บล็อก plugins {} จะใช้รหัสปลั๊กอินแทน
สำหรับปลั๊กอินส่วนใหญ่ รหัสปลั๊กอินคือสตริงที่ใช้เมื่อคุณใช้ปลั๊กอินโดยใช้ apply plugin ตัวอย่างเช่น รหัสปลั๊กอินต่อไปนี้เป็นส่วนหนึ่งของปลั๊กอิน Android Gradle
com.android.applicationcom.android.librarycom.android.lintcom.android.test
ดูรายการปลั๊กอินทั้งหมดได้ในที่เก็บ Maven ของ Google
ปลั๊กอิน Kotlin สามารถอ้างอิงได้ด้วยรหัสปลั๊กอินหลายรายการ เราขอแนะนำให้ใช้ รหัสปลั๊กอินที่มีเนมสเปซ และปรับโครงสร้างจากรหัสปลั๊กอินแบบย่อเป็นรหัสปลั๊กอินที่มีเนมสเปซตามตารางต่อไปนี้
| รหัสปลั๊กอินแบบย่อ | รหัสปลั๊กอินที่มีเนมสเปซ |
|---|---|
kotlin |
org.jetbrains.kotlin.jvm |
kotlin-android |
org.jetbrains.kotlin.android |
kotlin-kapt |
org.jetbrains.kotlin.kapt |
kotlin-parcelize |
org.jetbrains.kotlin.plugin.parcelize |
นอกจากนี้ คุณยังค้นหาปลั๊กอินได้ในพอร์ทัลปลั๊กอิน Gradle, ที่เก็บส่วนกลางของ Maven และที่เก็บ Maven ของ Google อ่านการพัฒนาปลั๊กอิน Gradle ที่กำหนดเองเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของรหัสปลั๊กอิน
ทำการเปลี่ยนโครงสร้างภายในโค้ด
เมื่อทราบรหัสของปลั๊กอินที่ใช้แล้ว ให้ทำตามขั้นตอนต่อไปนี้
หากคุณยังมีที่เก็บสำหรับปลั๊กอินที่ประกาศไว้ในบล็อก
buildscript {}ให้ย้ายที่เก็บเหล่านั้นไปยังไฟล์settings.gradleแทนเพิ่มปลั๊กอินลงในบล็อก
plugins {}ในไฟล์build.gradleระดับบนสุด คุณต้องระบุรหัสและ เวอร์ชันของปลั๊กอินที่นี่ หากไม่จำเป็นต้องใช้ปลั๊กอินกับโปรเจ็กต์รูท ให้ใช้apply falseนำรายการ
classpathออกจากไฟล์build.gradle.ktsระดับบนสุดใช้ปลั๊กอินโดยเพิ่มลงในบล็อก
plugins {}ในไฟล์build.gradleระดับโมดูล คุณเพียงต้องระบุรหัสของปลั๊กอินที่นี่เนื่องจากเวอร์ชันจะรับค่ามาจากโปรเจ็กต์รูทนำการเรียก
apply pluginสำหรับปลั๊กอินออกจากไฟล์build.gradleระดับโมดูล
ตัวอย่างเช่น การตั้งค่านี้ใช้บล็อก 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")
การตั้งค่าที่เทียบเท่ากันโดยใช้บล็อก 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()
}
}
แปลงบล็อกปลั๊กอิน
การใช้ปลั๊กอินจากบล็อก plugins {} จะคล้ายกันใน Groovy และ Kotlin
โค้ดต่อไปนี้แสดงวิธีใช้ปลั๊กอินใน Groovy เมื่อใช้แคตตาล็อกเวอร์ชัน
// Top-level build.gradle file
plugins {
alias libs.plugins.android.application apply false
...
}
// Module-level build.gradle file
plugins {
alias libs.plugins.android.application
...
}
โค้ดต่อไปนี้แสดงวิธีทำแบบเดียวกันใน 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)
...
}
โค้ดต่อไปนี้แสดงวิธีใช้ปลั๊กอินใน Groovy เมื่อคุณไม่ได้ใช้แคตตาล็อกเวอร์ชัน
// 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'
...
}
โค้ดต่อไปนี้แสดงวิธีทำแบบเดียวกันใน 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")
...
}
ดูรายละเอียดเพิ่มเติมเกี่ยวกับบล็อก plugins {} ได้ที่การใช้ปลั๊กอินในเอกสารประกอบของ Gradle
เบ็ดเตล็ด
ดูตัวอย่างโค้ด Kotlin สำหรับฟังก์ชันการทำงานอื่นๆ ได้ที่หน้าเอกสารประกอบต่อไปนี้
- หากมีการกำหนดค่า ProGuard โปรดดูเปิดใช้การลดขนาด การปรับให้ยากต่อการอ่าน และการเพิ่มประสิทธิภาพ
- หากมีบล็อก
signingConfig {}โปรดดูหัวข้อนำข้อมูลการรับรองออกจากไฟล์บิลด์ - หากคุณใช้พร็อพเพอร์ตี้ทั่วทั้งโปรเจ็กต์ โปรดดูหัวข้อกำหนดค่าพร็อพเพอร์ตี้ทั่วทั้งโปรเจ็กต์
ปัญหาที่ทราบแล้ว
ปัญหาที่ทราบคือความเร็วในการบิลด์อาจช้ากว่าเมื่อใช้ Kotlin เมื่อเทียบกับ Groovy
วิธีรายงานปัญหา
ดูวิธีการระบุข้อมูลที่เราต้องการเพื่อคัดแยกปัญหาได้ที่รายละเอียดเกี่ยวกับข้อบกพร่องของเครื่องมือสร้างและ Gradle จากนั้นรายงานข้อบกพร่องโดยใช้เครื่องมือติดตามปัญหาสาธารณะของ Google
แหล่งข้อมูลเพิ่มเติม
ดูตัวอย่างการทำงานของไฟล์บิลด์ Gradle ที่เขียนด้วย Kotlin ได้ที่แอปตัวอย่าง Now In Android ใน GitHub