ย้ายข้อมูลไปยัง Kotlin ในตัว

ปลั๊กอิน Android Gradle 9.0 มีการรองรับ Kotlin ในตัวและเปิดใช้โดยค่าเริ่มต้น ซึ่งหมายความว่าคุณไม่จำเป็นต้องใช้ปลั๊กอิน org.jetbrains.kotlin.android (หรือ kotlin-android) ในไฟล์บิลด์ เพื่อคอมไพล์ไฟล์ต้นฉบับ Kotlin อีกต่อไป เมื่อใช้ Kotlin ในตัว ไฟล์บิลด์จะเรียบง่ายขึ้นและคุณจะหลีกเลี่ยงปัญหา ความเข้ากันได้ระหว่าง AGP กับปลั๊กอิน kotlin-android ได้

เปิดใช้ Kotlin ในตัว

คุณต้องใช้ AGP 9.0 ขึ้นไปจึงจะมี Kotlin ในตัว AGP 9.0 เปิดใช้ Kotlin ในตัวสำหรับโมดูลทั้งหมดที่คุณใช้ AGP อยู่แล้ว คุณจึงไม่จำเป็นต้องดำเนินการใดๆ เพื่อเปิดใช้ อย่างไรก็ตาม หากก่อนหน้านี้คุณเลือกไม่ใช้ Kotlin ในตัวโดยตั้งค่า android.builtInKotlin=false ในไฟล์ gradle.properties คุณจะต้องนำการตั้งค่านั้นออก หรือตั้งค่า android.builtInKotlin=true เพื่อเปิดใช้

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

ขั้นตอนการย้ายข้อมูล

หลังจากอัปเกรดโปรเจ็กต์จาก AGP เวอร์ชันเก่าเป็น AGP 9.0 ขึ้นไป หรือหลังจากเปิดใช้ Kotlin ในตัวด้วยตนเอง คุณอาจเห็นข้อความแสดงข้อผิดพลาดต่อไปนี้

Failed to apply plugin 'org.jetbrains.kotlin.android'.
> Cannot add extension with name 'kotlin', as there is an extension already registered with that name.

...หรือ

Failed to apply plugin 'com.jetbrains.kotlin.android'
> The 'org.jetbrains.kotlin.android' plugin is no longer required for Kotlin support since AGP 9.0.

เนื่องจาก Kotlin ในตัวกำหนดให้คุณต้องทำการเปลี่ยนแปลงบางอย่างใน โปรเจ็กต์ หากต้องการแก้ไขข้อผิดพลาดนี้ ให้ทำตามขั้นตอนต่อไปนี้

  1. นำkotlin-androidปลั๊กอินออก
  2. ย้ายข้อมูลปลั๊กอิน kotlin-kapt หากจำเป็น
  3. ย้ายข้อมูลบล็อก kotlinOptions{} หากจำเป็น

1. นำปลั๊กอิน kotlin-android ออก

นำปลั๊กอิน org.jetbrains.kotlin.android (หรือ kotlin-android) ออกจากไฟล์บิลด์ระดับโมดูลที่คุณใช้ โค้ดที่แน่นอนที่จะนำออกจะขึ้นอยู่กับว่าคุณใช้แคตตาล็อกเวอร์ชันเพื่อประกาศปลั๊กอินหรือไม่

มีแคตตาล็อกเวอร์ชัน

Kotlin

// Module-level build file
plugins {
    alias(libs.plugins.kotlin.android)
}

Groovy

// Module-level build file
plugins {
    alias(libs.plugins.kotlin.android)
}

ไม่มีแคตตาล็อกเวอร์ชัน

Kotlin

// Module-level build file
plugins {
    id("org.jetbrains.kotlin.android")
}

Groovy

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

จากนั้นนำปลั๊กอินออกจากไฟล์บิลด์ระดับบนสุด

มีแคตตาล็อกเวอร์ชัน

Kotlin

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

Groovy

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

ไม่มีแคตตาล็อกเวอร์ชัน

Kotlin

// Top-level build file
plugins {
    id("org.jetbrains.kotlin.android") version "KOTLIN_VERSION" apply false
}

Groovy

// Top-level build file
plugins {
    id 'org.jetbrains.kotlin.android' version 'KOTLIN_VERSION' apply false
}

หากใช้แคตตาล็อกเวอร์ชัน ให้นำคำจำกัดความของปลั๊กอินออกจาก ไฟล์ TOML ของแคตตาล็อกเวอร์ชันด้วย (โดยปกติคือ gradle/libs.versions.toml)

[plugins]
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "KOTLIN_VERSION" }

2. ย้ายข้อมูลปลั๊กอิน kotlin-kapt หากจำเป็น

หากคุณใช้ org.jetbrains.kotlin.kapt (หรือ kotlin-kapt) ในไฟล์บิลด์ ปลั๊กอินนี้จะใช้ร่วมกับ Kotlin ในตัวไม่ได้ คุณต้องแทนที่ปลั๊กอินนี้ด้วยปลั๊กอิน com.android.legacy-kapt โดยใช้เวอร์ชันเดียวกับปลั๊กอิน Android Gradle ปัจจุบัน

ตัวอย่างเช่น หากใช้แคตตาล็อกเวอร์ชัน ให้อัปเดตไฟล์ TOML ของแคตตาล็อกเวอร์ชันดังนี้

[plugins]
android-application = { id = "com.android.application", version.ref = "AGP_VERSION" }

# Add the following plugin definition
legacy-kapt = { id = "com.android.legacy-kapt", version.ref = "AGP_VERSION" }

# Remove the following plugin definition
kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "KOTLIN_VERSION" }

จากนั้นอัปเดตไฟล์บิลด์

Kotlin

// Top-level build file
plugins {
    alias(libs.plugins.legacy.kapt) apply false
    alias(libs.plugins.kotlin.kapt) apply false
}

Groovy

// Top-level build file
plugins {
    alias(libs.plugins.legacy.kapt) apply false
    alias(libs.plugins.kotlin.kapt) apply false
}

Kotlin

// Module-level build file
plugins {
    alias(libs.plugins.legacy.kapt)
    alias(libs.plugins.kotlin.kapt)
}

Groovy

// Module-level build file
plugins {
    alias(libs.plugins.legacy.kapt)
    alias(libs.plugins.kotlin.kapt)
}

3. ย้ายข้อมูลบล็อก kotlinOptions{} หากจำเป็น

หากใช้ android.kotlinOptions{} DSL คุณต้อง ย้ายข้อมูลไปยัง kotlin.compilerOptions{} DSL

เช่น อัปเดตโค้ดนี้

Kotlin

android {
    kotlinOptions {
        languageVersion = "2.0"
        jvmTarget = "11"
    }
}

Groovy

android {
    kotlinOptions {
        languageVersion = "2.0"
        jvmTarget = "11"
    }
}

...เป็น DSL ใหม่

Kotlin

kotlin {
    compilerOptions {
        languageVersion = org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0
        // Optional: Set jvmTarget
        // jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11
    }
}

Groovy

kotlin {
    compilerOptions {
        languageVersion = org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0
        // Optional: Set jvmTarget
        // jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11
    }
}

รายงานปัญหา

หลังจากทำตามขั้นตอนก่อนหน้าแล้ว หากพบปัญหา โปรดดูปัญหาที่ทราบแล้วในคำอธิบายของปัญหา #438678642 และส่งความคิดเห็นให้เราหากจำเป็น

เลือกไม่ใช้ Kotlin ในตัว

หากย้ายข้อมูลโปรเจ็กต์เพื่อใช้ Kotlin ในตัวไม่ได้ ให้ตั้งค่า android.builtInKotlin = false ในไฟล์ gradle.properties เพื่อปิดใช้ Kotlin ในตัวชั่วคราว เมื่อทำเช่นนั้น บิลด์จะแสดงคำเตือนที่แจ้งให้คุณย้ายข้อมูลไปยัง Kotlin ในตัว เนื่องจากคุณจะปิดใช้ Kotlin ในตัวใน AGP 9.x เวอร์ชันในอนาคตก่อน AGP 10.0 ไม่ได้

การย้ายข้อมูลทีละโมดูล

พร็อพเพอร์ตี้ android.builtInKotlin Gradle ช่วยให้คุณเปิดหรือปิดใช้ Kotlin ในตัว สำหรับโมดูลทั้งหมดที่ใช้ AGP ได้

หากการย้ายข้อมูลโมดูลทั้งหมดพร้อมกันเป็นเรื่องยาก คุณสามารถย้ายข้อมูลทีละโมดูลได้โดยทำดังนี้

  1. ตั้งค่า android.builtInKotlin = false ในไฟล์ gradle.properties เพื่อ ปิดใช้ Kotlin ในตัวสำหรับทุกโมดูล

  2. ใช้ปลั๊กอิน com.android.experimental.built-in-kotlin กับโมดูล ที่ต้องการเปิดใช้ Kotlin ในตัว โดยใช้เวอร์ชันเดียวกับ ปลั๊กอิน Android Gradle ปัจจุบัน

  3. ทำตามขั้นตอนการย้ายข้อมูลก่อนหน้าเพื่อย้ายข้อมูลโมดูลนี้ไปยัง Kotlin ในตัว

  4. เมื่อย้ายข้อมูลโมดูลทั้งหมดแล้ว ให้นำการตั้งค่า android.builtInKotlin = false ใน gradle.properties และปลั๊กอิน com.android.experimental.built-in-kotlin ในไฟล์บิลด์ออก