ปลั๊กอิน 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 ในตัวกำหนดให้คุณต้องทำการเปลี่ยนแปลงบางอย่างในโปรเจ็กต์ หากต้องการแก้ไขข้อผิดพลาดนี้ ให้ทำตามขั้นตอนต่อไปนี้
- นำปลั๊กอิน
kotlin-androidออก - ย้ายปลั๊กอิน
kotlin-kaptหากจำเป็น - ย้าย DSL
android.kotlinOptions{}หากจำเป็น - ย้าย 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 definitionkotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "KOTLIN_VERSION" }
จากนั้นอัปเดตไฟล์บิลด์
Kotlin
// Top-level build file plugins { alias(libs.plugins.legacy.kapt) apply falsealias(libs.plugins.kotlin.kapt) apply false}
ดึงดูด
// Top-level build file plugins { alias(libs.plugins.legacy.kapt) apply falsealias(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 supportedkotlin.sourceSets.named("main") { kotlin.srcDir("additionalSourceDirectory/kotlin") }# Adding Kotlin source directories to AndroidSourceSet.java is also not supportedandroid.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 supportedkotlin.sourceSets.named("main") { kotlin.srcDir("additionalSourceDirectory/kotlin") }# Adding Kotlin source directories to AndroidSourceSet.java is also not supportedandroid.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
หากการย้ายทุกโมดูลพร้อมกันเป็นเรื่องยาก คุณสามารถย้ายทีละโมดูลได้โดยทำดังนี้
ตั้งค่า
android.builtInKotlin=falseในไฟล์gradle.propertiesเพื่อปิดใช้ Kotlin ในตัวสำหรับโมดูลทั้งหมดใช้ปลั๊กอิน
com.android.built-in-kotlinกับโมดูลที่ต้องการเปิดใช้ Kotlin ในตัว โดยใช้เวอร์ชันเดียวกับปลั๊กอิน Android Gradleทำตามขั้นตอนการย้ายก่อนหน้าเพื่อย้ายโมดูลนี้ไปใช้ Kotlin ในตัว
เมื่อย้ายโมดูลทั้งหมดแล้ว ให้นำการตั้งค่า
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 }