ปลั๊กอิน Android Gradle 4.0 เพิ่มการรองรับการใช้ Kotlin ในบิลด์ของ Gradle แทน Groovy ซึ่งเป็นภาษาโปรแกรม ใช้กันโดยทั่วไปในไฟล์การกำหนดค่า Gradle
สำหรับการเขียนสคริปต์ Gradle นั้นใช้ Kotlin มากกว่า Groovy เพราะ Kotlin เองทำงานได้ อ่านง่ายขึ้น รวมถึงมีการตรวจสอบเวลาคอมไพล์และการสนับสนุน IDE ที่ดีขึ้น
แม้ว่าในปัจจุบัน Kotlin จะผสานรวมได้ดีกว่าในโค้ดของ Android Studio Editor เมื่อเทียบกับ Groovy แล้ว บิลด์ที่ใช้ Kotlin จะทำงานได้ช้ากว่า สร้างสิ่งต่างๆ โดยใช้ Groovy ดังนั้นให้พิจารณาสร้างประสิทธิภาพเมื่อตัดสินใจว่าจะ ย้ายข้อมูล
หน้านี้มีข้อมูลพื้นฐานเกี่ยวกับการแปลงรูปแบบ Gradle สร้างไฟล์จาก Groovy ไปจนถึง Kotlin เพื่อการย้ายข้อมูลที่ครอบคลุมมากขึ้น โปรดดู Gradle เอกสารอย่างเป็นทางการ
ไทม์ไลน์
โปรเจ็กต์ใหม่ๆ จะใช้ Kotlin DSL ด้วย Android Studio Giraffe
(build.gradle.kts
) โดยค่าเริ่มต้นสำหรับการกำหนดค่าบิลด์ วิธีนี้จะช่วยเพิ่ม
ประสบการณ์การตัดต่อที่ดีกว่า Groovy DSL (build.gradle
) ด้วยไวยากรณ์
การไฮไลต์ การเติมโค้ด และการไปยังส่วนต่างๆ ของการประกาศ หากต้องการทราบข้อมูลเพิ่มเติม
โปรดดู
Gradle Kotlin DSL Primer
คำทั่วไป
Kotlin DSL: หมายถึงปลั๊กอิน Kotlin DSL สำหรับ Android Gradle เป็นหลัก หรือในบางครั้ง Gradle Kotlin DSL พื้นฐาน
ในคำแนะนำในการย้ายข้อมูลนี้ "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 ไม่รองรับ ตัวอย่างเช่น สำหรับ
buildTypes
องค์ประกอบบูลีน DSL คุณต้องนำหน้าด้วย 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 กำหนดโดยใช้ไวยากรณ์ที่ต่างกัน ดึงดูด
ใช้ []
ในขณะที่การเรียกใช้ 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 {}
บล็อกแทน บล็อก 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.application
com.android.library
com.android.lint
com.android.test
คุณสามารถดูรายการปลั๊กอินทั้งหมดได้ใน ที่เก็บของ Google Maven
ปลั๊กอิน Kotlin อ้างอิงได้โดยใช้รหัสปลั๊กอินหลายรหัส เราขอแนะนำให้ใช้ รหัสปลั๊กอินเนมสเปซ และเปลี่ยนโครงสร้างภายในโค้ดจากชวเลขเป็นรหัสปลั๊กอินเนมสเปซโดยใช้ ตารางต่อไปนี้
รหัสปลั๊กอินแบบย่อ | รหัสปลั๊กอิน 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 |
คุณยังค้นหาปลั๊กอินใน พอร์ทัลปลั๊กอิน Gradle ที่เก็บส่วนกลางของ Maven และ ที่เก็บของ Google Maven อ่านแล้ว การพัฒนาปลั๊กอิน 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 จากนั้นให้ทำดังนี้ รายงานข้อบกพร่องโดยใช้ เครื่องมือติดตามปัญหาสาธารณะ
แหล่งข้อมูลเพิ่มเติม
สำหรับตัวอย่างที่ใช้งานได้ของไฟล์บิลด์ Gradle ที่เขียนด้วย Kotlin โปรดดู ตอนนี้อยู่ในแอปตัวอย่างของ Android ใน GitHub