ย้ายข้อมูลไปยัง 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 คุณจะต้องนำการตั้งค่าดังกล่าวออกหรือตั้งค่าเป็น 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. ย้าย DSL android.kotlinOptions{} หากจำเป็น
  4. ย้าย DSL kotlin.sourceSets{} หากจำเป็น

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

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

ใช้แคตตาล็อกเวอร์ชัน

Kotlin

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

ดึงดูด

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

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

Kotlin

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

ดึงดูด

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

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

ใช้แคตตาล็อกเวอร์ชัน

Kotlin

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

ดึงดูด

// 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
}

ดึงดูด

// 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 ในตัว หากใช้ kapt เราขอแนะนำให้คุณ ย้ายโปรเจ็กต์ไปใช้ KSP

หากยังย้ายไปใช้ KSP ไม่ได้ ให้แทนที่ปลั๊กอิน kotlin-kapt ด้วยปลั๊กอิน 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
}

ดึงดูด

// 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)
}

ดึงดูด

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

3. ย้าย DSL android.kotlinOptions{} หากจำเป็น

หากใช้ DSL android.kotlinOptions{} คุณจะต้อง ย้าย DSL นี้ไปใช้ DSL kotlin.compilerOptions{}

ตัวอย่างเช่น ให้อัปเดตโค้ดนี้

Kotlin

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

ดึงดูด

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
    }
}

ดึงดูด

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

4. ย้าย DSL kotlin.sourceSets{} หากจำเป็น

เมื่อใช้ปลั๊กอิน kotlin-android AGP จะอนุญาตให้คุณเพิ่มไดเรกทอรีแหล่งที่มาของ Kotlin เพิ่มเติมโดยใช้ DSL android.sourceSets{} หรือ DSL kotlin.sourceSets{} เมื่อใช้ DSL android.sourceSets{} คุณจะเพิ่มไดเรกทอรีลงในชุด AndroidSourceSet.kotlin หรือชุด AndroidSourceSet.java ก็ได้

เมื่อใช้ Kotlin ในตัว ตัวเลือกที่รองรับเพียงตัวเลือกเดียวคือการเพิ่มไดเรกทอรีลงในชุด AndroidSourceSet.kotlin โดยใช้ DSL android.sourceSets{} หากใช้ตัวเลือกที่ไม่รองรับ ให้ย้ายตัวเลือกเหล่านั้นดังนี้

Kotlin

# Adding Kotlin source directories to kotlin.sourceSets is not supported
kotlin.sourceSets.named("main") {
    kotlin.srcDir("additionalSourceDirectory/kotlin")
}

# Adding Kotlin source directories to AndroidSourceSet.java is also not supported
android.sourceSets.named("main") {
    java.directories += "additionalSourceDirectory/kotlin"
}

# Add Kotlin source directories to AndroidSourceSet.kotlin
android.sourceSets.named("main") {
    kotlin.directories += "additionalSourceDirectory/kotlin"
}

ดึงดูด

# Adding Kotlin source directories to kotlin.sourceSets is not supported
kotlin.sourceSets.named("main") {
    kotlin.srcDir("additionalSourceDirectory/kotlin")
}

# Adding Kotlin source directories to AndroidSourceSet.java is also not supported
android.sourceSets.named("main") {
    java.directories.add("additionalSourceDirectory/kotlin")
}

# Add Kotlin source directories to AndroidSourceSet.kotlin
android.sourceSets.named("main") {
    kotlin.directories.add("additionalSourceDirectory/kotlin")
}

หากต้องการเพิ่มไดเรกทอรีแหล่งที่มาของ Kotlin ลงในตัวแปรเฉพาะหรือหาก ไดเรกทอรีสร้างขึ้นโดยงาน คุณสามารถใช้วิธี addStaticSourceDirectory หรือ addGeneratedSourceDirectory ใน Variant API ได้

Kotlin

androidComponents.onVariants { variant ->
    variant.sources.kotlin!!.addStaticSourceDirectory("additionalSourceDirectory/kotlin")
    variant.sources.kotlin!!.addGeneratedSourceDirectory(TASK_PROVIDER, TASK_OUTPUT)
}

ดึงดูด

androidComponents.onVariants { variant ->
    variant.sources.kotlin!!.addStaticSourceDirectory("additionalSourceDirectory/kotlin")
    variant.sources.kotlin!!.addGeneratedSourceDirectory(TASK_PROVIDER, TASK_OUTPUT)
}

รายงานปัญหา

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

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

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

เมื่อพร้อมที่จะย้ายโปรเจ็กต์แล้ว ให้เปิดใช้ Kotlin ในตัว และทำตามขั้นตอนการย้าย

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

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

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

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

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

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

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

ตัวเลือกในการปิดใช้ Kotlin ในตัวแบบเลือกได้

ปลั๊กอิน Android Gradle เวอร์ชัน 9.0 เปิดใช้ Kotlin ในตัวสำหรับโมดูลทั้งหมดที่ใช้ปลั๊กอินนี้ เราขอแนะนำให้ปิดใช้ Kotlin ในตัวแบบเลือกได้สำหรับโมดูลที่ไม่มีแหล่งที่มาของ Kotlin ในโปรเจ็กต์ขนาดใหญ่ การดำเนินการนี้จะนำทั้งงานคอมไพล์ Kotlin ซึ่งมีค่าใช้จ่ายด้านประสิทธิภาพการทำงานของบิลด์เล็กน้อย และทรัพยากร Dependency ไลบรารีมาตรฐานของ Kotlin โดยอัตโนมัติออก

หากต้องการปิดใช้ Kotlin ในตัวสำหรับโมดูล ให้ตั้งค่า enableKotlin = false ในไฟล์บิลด์ของโมดูลนั้น

Kotlin

android {
    enableKotlin = false
}

ดึงดูด

android {
    enableKotlin = false
}