ย้ายข้อมูลการกำหนดค่าบิลด์จาก Groovy ไปยัง Kotlin

ปลั๊กอิน 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 ที่กำหนดเอง เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของรหัสปลั๊กอิน

ดำเนินการเปลี่ยนโครงสร้างภายในโค้ด

เมื่อทราบรหัสของปลั๊กอินที่ใช้แล้ว ให้ทำตามขั้นตอนต่อไปนี้

  1. หากคุณยังคงมีที่เก็บสำหรับปลั๊กอินที่ประกาศใน buildscript {} บล็อก ย้ายไปที่ settings.gradle แทน

  2. เพิ่มปลั๊กอินในบล็อก plugins {} ในระดับบนสุด build.gradle คุณต้องระบุรหัสและ ของปลั๊กอินได้ที่นี่ หากปลั๊กอินไม่จำเป็นต้องใช้ เพื่อใช้กับโปรเจ็กต์รูท ให้ใช้ apply false

  3. ลบรายการ classpath ออกจากไฟล์ build.gradle.kts ระดับบนสุด

  4. ใช้ปลั๊กอินโดยเพิ่มลงในบล็อก plugins {} ใน build.gradle ระดับโมดูล คุณเพียงต้องระบุ รหัสที่นี่เนื่องจากมีการรับเวอร์ชันมาจากโปรเจ็กต์รูท

  5. นำการเรียก 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 สําหรับฟังก์ชันอื่นๆ โปรดดูรายการต่อไปนี้ หน้าเอกสารประกอบ

ปัญหาที่ทราบ

ณ ปัจจุบัน ปัญหาที่ทราบแล้ว คือความเร็วในการสร้างเมื่อใช้ Kotlin อาจช้ากว่า Groovy

วิธีรายงานปัญหา

ดูวิธีการให้ข้อมูลที่เราต้องการเพื่อคัดแยกปัญหาของคุณได้ที่ รายละเอียดเกี่ยวกับเครื่องมือสร้างและข้อบกพร่องของ Gradle จากนั้นให้ทำดังนี้ รายงานข้อบกพร่องโดยใช้ เครื่องมือติดตามปัญหาสาธารณะ

แหล่งข้อมูลเพิ่มเติม

สำหรับตัวอย่างที่ใช้งานได้ของไฟล์บิลด์ Gradle ที่เขียนด้วย Kotlin โปรดดู ตอนนี้อยู่ในแอปตัวอย่างของ Android ใน GitHub