ปลั๊กอิน com.android.kotlin.multiplatform.library Gradle เป็นเครื่องมือที่ได้รับการสนับสนุนอย่างเป็นทางการ
สำหรับการเพิ่มเป้าหมาย Android ลงใน Kotlin Multiplatform (KMP)
โมดูลไลบรารี ซึ่งช่วยลดความซับซ้อนในการกำหนดค่าโปรเจ็กต์ ปรับปรุง
ประสิทธิภาพการบิลด์ และผสานรวมกับ Android Studio ได้ดียิ่งขึ้น
การใช้ปลั๊กอิน com.android.library สำหรับการพัฒนา KMP ขึ้นอยู่กับ API ของปลั๊กอิน Android
Gradle ที่เลิกใช้งานแล้วและต้องเลือกใช้ในปลั๊กอิน Android
Gradle 9.0 ขึ้นไป (ไตรมาสที่ 4 ปี 2025) เราคาดว่าจะนำ API เหล่านี้ออกในปลั๊กอิน Android Gradle 10.0
(ครึ่งหลังของปี 2026)
หากต้องการใช้ปลั๊กอินนี้ โปรดดูส่วนใช้ปลั๊กอิน Android-KMP หากต้องการย้ายข้อมูลจาก API เดิม โปรดดูคำแนะนำ ในการย้ายข้อมูล
หากต้องการความช่วยเหลือเกี่ยวกับการย้ายข้อมูล AGP 9.0 ขึ้นไป คุณสามารถใช้ทักษะของเอเจนต์ ที่ JetBrains สร้างขึ้นสำหรับแอป KMP ได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ทักษะใน Android Studio ได้ที่ขยายโหมดตัวแทนด้วยทักษะ โปรดทราบ ว่าผลลัพธ์ของ AI ไม่สามารถคาดการณ์ได้อย่างสมบูรณ์
ฟีเจอร์หลักและความแตกต่าง
ปลั๊กอิน Android-KMP ออกแบบมาสำหรับโปรเจ็กต์ KMP โดยเฉพาะและแตกต่าง
จากปลั๊กอิน com.android.library มาตรฐานในหลายๆ ด้านที่สำคัญ ดังนี้
สถาปัตยกรรมแบบตัวแปรเดียว: ปลั๊กอินใช้ตัวแปรเดียว ซึ่งจะนำการรองรับ รสชาติของผลิตภัณฑ์และประเภทบิลด์ออก ซึ่งจะช่วยลดความซับซ้อนในการกำหนดค่า และเพิ่มประสิทธิภาพการบิลด์
เพิ่มประสิทธิภาพสำหรับ KMP: ปลั๊กอินได้รับการออกแบบมาสำหรับไลบรารี KMP โดยมุ่งเน้นที่โค้ด Kotlin ที่แชร์และความสามารถในการทำงานร่วมกัน โดยไม่รองรับบิลด์แบบเนทีฟเฉพาะ Android, AIDL และ RenderScript
การทดสอบที่ปิดใช้โดยค่าเริ่มต้น: การทดสอบหน่วยและการทดสอบอุปกรณ์ (การทดสอบการวัดคุม) จะปิดใช้โดยค่าเริ่มต้นเพื่อเพิ่มความเร็วในการบิลด์ คุณสามารถเปิดใช้ได้หากจำเป็น
ไม่มีส่วนขยาย Android ระดับบนสุด: การกำหนดค่าจะได้รับการจัดการด้วยบล็อก
androidภายใน KMP DSL ของ Gradle ซึ่งจะรักษาโครงสร้างโปรเจ็กต์ KMP ที่สอดคล้องกัน ไม่มีการบล็อกส่วนขยายandroidระดับบนสุดเลือกใช้การคอมไพล์ Java: การคอมไพล์ Java จะปิดใช้โดยค่าเริ่มต้น ใช้
withJava()ในบล็อกandroidเพื่อเปิดใช้ ซึ่งจะช่วยปรับปรุงเวลาบิลด์ เมื่อไม่จำเป็นต้องคอมไพล์ Java
ประโยชน์ของปลั๊กอินไลบรารี Android-KMP
ปลั๊กอิน Android-KMP มีประโยชน์ดังต่อไปนี้สำหรับโปรเจ็กต์ KMP
ปรับปรุงประสิทธิภาพและความเสถียรของการสร้าง: ออกแบบมาเพื่อความเร็วในการสร้างที่เพิ่มประสิทธิภาพและปรับปรุงความเสถียรภายในโปรเจ็กต์ KMP การมุ่งเน้นที่เวิร์กโฟลว์ KMP ช่วยให้กระบวนการบิลด์มีประสิทธิภาพและเชื่อถือได้มากขึ้น
การผสานรวม IDE ที่ดียิ่งขึ้น: ช่วยให้การเติมโค้ด การนำทาง การแก้ไขข้อบกพร่อง และประสบการณ์โดยรวมของนักพัฒนาซอฟต์แวร์ดีขึ้นเมื่อทำงานกับไลบรารี KMP Android
การกำหนดค่าโปรเจ็กต์ที่ง่ายขึ้น: ปลั๊กอินช่วยลดความซับซ้อนในการกำหนดค่า สำหรับโปรเจ็กต์ KMP โดยการนำความซับซ้อนเฉพาะของ Android เช่น ตัวแปรบิลด์ ออก ซึ่งจะทำให้ไฟล์บิลด์สะอาดและบำรุงรักษาได้ง่ายขึ้น ก่อนหน้านี้ การใช้ปลั๊กอิน
com.android.libraryในโปรเจ็กต์ KMP อาจทำให้เกิดชื่อชุดซอร์สที่สับสน เช่นandroidAndroidTestรูปแบบการตั้งชื่อนี้ ไม่ค่อยเป็นที่เข้าใจสำหรับนักพัฒนาซอฟต์แวร์ที่คุ้นเคยกับโครงสร้างโปรเจ็กต์ KMP มาตรฐาน
วิธีแก้ปัญหาสำหรับฟีเจอร์ที่ไม่รองรับ
เมื่อเทียบกับการผสานรวม KMP กับปลั๊กอิน com.android.library ปลั๊กอิน
com.android.kotlin.multiplatform.library จะไม่มีฟีเจอร์บางอย่าง วิธีแก้ปัญหาสำหรับฟีเจอร์ที่ไม่รองรับมีดังนี้
สร้างตัวแปร
ระบบไม่รองรับประเภทบิลด์และรสชาติของผลิตภัณฑ์ เนื่องจากปลั๊กอินใหม่ ใช้สถาปัตยกรรมตัวแปรเดียว ซึ่งช่วยลดความซับซ้อนของการกำหนดค่าและ ปรับปรุงประสิทธิภาพการสร้าง
หากต้องการตัวแปรบิลด์ เราขอแนะนำ ให้สร้างโมดูลไลบรารี Android แบบสแตนด์อโลนแยกต่างหากโดยใช้ปลั๊กอิน
com.android.libraryกำหนดค่าประเภทบิลด์และเวอร์ชันผลิตภัณฑ์ ภายในโมดูลนั้น แล้วใช้เป็นทรัพยากร Dependency ของโปรเจ็กต์มาตรฐาน จากชุดซอร์สandroidMainของไลบรารี Kotlin Multiplatform โปรดดูรายละเอียดเพิ่มเติมที่หัวข้อสร้างไลบรารี Android และ กำหนดค่าตัวแปรบิลด์การเชื่อมโยงข้อมูลและการเชื่อมโยงมุมมอง
ซึ่งเป็นฟีเจอร์ของเฟรมเวิร์ก UI เฉพาะของ Android ที่เชื่อมโยงอย่างใกล้ชิดกับระบบ View ของ Android และเลย์เอาต์ XML ด้วยปลั๊กอินไลบรารี Android-KMP ใหม่ เราขอแนะนำให้คุณจัดการ UI โดยใช้เฟรมเวิร์กแบบหลายแพลตฟอร์ม เช่น Compose Multiplatform การเชื่อมโยงข้อมูลและการเชื่อมโยง View ถือเป็นรายละเอียดการใช้งานของแอป Android ขั้นสุดท้าย ไม่ใช่ไลบรารีที่แชร์ได้
การรองรับบิลด์เนทีฟ
ปลั๊กอินใหม่นี้มุ่งเน้นการสร้าง AAR มาตรฐานสำหรับเป้าหมาย Android การผสานรวมโค้ดแบบเนทีฟใน Kotlin Multiplatform จะได้รับการจัดการโดยเป้าหมายเนทีฟของ KMP เองโดยตรง (เช่น
androidNativeArm64และandroidNativeX86) และความสามารถในการทำงานร่วมกันกับ C หากต้องการรวมโค้ด C/C++ แบบเนทีฟ คุณควร กำหนดให้เป็นส่วนหนึ่งของชุดซอร์สทั่วไปหรือชุดซอร์สแบบเนทีฟ และกำหนดค่า C-interop ภายในบล็อกkotlinแทนที่จะใช้กลไกexternalNativeBuildเฉพาะของ Androidหรือหากต้องการการสนับสนุนการบิลด์เนทีฟผ่าน
externalNativeBuildเราขอแนะนำให้สร้างโมดูลcom.android.libraryแบบสแตนด์อโลนแยกต่างหาก ซึ่งคุณสามารถผสานรวมโค้ดแบบเนทีฟ และใช้ไลบรารีแบบสแตนด์อโลนนั้นจากชุดซอร์สandroidMainของโปรเจ็กต์ไลบรารี Kotlin Multiplatform ดูรายละเอียดเพิ่มเติมได้ที่สร้างไลบรารี Android และ เพิ่มโค้ด C และ C++ ลงในโปรเจ็กต์BuildConfigชั้นเรียนฟีเจอร์
BuildConfigมีประโยชน์มากที่สุดในสภาพแวดล้อมที่มีหลายตัวแปร เนื่องจากปลั๊กอินไลบรารี Kotlin Multiplatform ใหม่ไม่ขึ้นอยู่กับตัวแปร และไม่รองรับประเภทบิลด์และ Product Flavor เราจึงไม่ได้ใช้ฟีเจอร์นี้ เราขอแนะนำให้ใช้BuildKonfigปลั๊กอิน หรือโซลูชันชุมชนที่คล้ายกันเพื่อสร้างข้อมูลเมตาสำหรับเป้าหมายทั้งหมดแทน
สิ่งที่ต้องมีก่อน
หากต้องการใช้ปลั๊กอิน com.android.kotlin.multiplatform.library คุณต้องกำหนดค่าโปรเจ็กต์ให้มีเวอร์ชันขั้นต่ำต่อไปนี้หรือสูงกว่า
- ปลั๊กอิน Android Gradle (AGP): 8.10.0
- ปลั๊กอิน Gradle ของ Kotlin (KGP): 2.0.0
ใช้ปลั๊กอิน Android-KMP กับโมดูลที่มีอยู่
หากต้องการใช้ปลั๊กอิน Android-KMP กับโมดูลไลบรารี KMP ที่มีอยู่ ให้ทำตามขั้นตอนต่อไปนี้
ประกาศปลั๊กอินในแคตตาล็อกเวอร์ชัน เปิดไฟล์ TOML ของแคตตาล็อกเวอร์ชัน (โดยปกติคือ
gradle/libs.versions.toml) แล้วเพิ่มส่วนคำจำกัดความของปลั๊กอิน# To check the version number of the latest Kotlin release, go to # https://kotlinlang.org/docs/releases.html [versions] androidGradlePlugin = "9.4.0" kotlin = "KOTLIN_VERSION" [plugins] kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } android-kotlin-multiplatform-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "androidGradlePlugin" }ใช้การประกาศปลั๊กอินในไฟล์บิลด์รูท เปิดไฟล์
build.gradle.ktsที่อยู่ในไดเรกทอรีรากของโปรเจ็กต์ เพิ่มอีเมลแทนของปลั๊กอินลงในบล็อกpluginsโดยใช้apply falseซึ่งจะทำให้ นามแฝงของปลั๊กอินพร้อมใช้งานในโปรเจ็กต์ย่อยทั้งหมดโดยไม่ต้องใช้ตรรกะของปลั๊กอิน กับโปรเจ็กต์รูทเองKotlin
// Root build.gradle.kts file plugins { alias(libs.plugins.kotlin.multiplatform) apply false // Add the following alias(libs.plugins.android.kotlin.multiplatform.library) apply false }
ดึงดูด
// Root build.gradle file plugins { alias(libs.plugins.kotlin.multiplatform) apply false // Add the following alias(libs.plugins.android.kotlin.multiplatform.library) apply false }
ใช้ปลั๊กอินในไฟล์บิลด์ของโมดูลไลบรารี KMP เปิดไฟล์
build.gradle.ktsในโมดูลไลบรารี KMP แล้วใช้ปลั๊กอินที่ ด้านบนของไฟล์ภายในบล็อกpluginsKotlin
// Module-specific build.gradle.kts file plugins { alias(libs.plugins.kotlin.multiplatform) // Add the following alias(libs.plugins.android.kotlin.multiplatform.library) }
ดึงดูด
// Module-specific build.gradle file plugins { alias(libs.plugins.kotlin.multiplatform) // Add the following alias(libs.plugins.android.kotlin.multiplatform.library) }
กำหนดค่าเป้าหมาย KMP ของ Android กำหนดค่าบล็อก Kotlin Multiplatform (
kotlin) เพื่อกำหนดเป้าหมาย Android ภายในkotlinบล็อก ให้ระบุ เป้าหมาย Android โดยใช้android:Kotlin
kotlin { android { namespace = "com.example.kmpfirstlib" compileSdk = 33 minSdk = 24 withJava() // enable java compilation support withHostTestBuilder {}.configure {} withDeviceTestBuilder { sourceSetTreeName = "test" } compilerOptions.configure { jvmTarget.set( org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8 ) } } sourceSets { androidMain { dependencies { // Add Android-specific dependencies here } } getByName("androidHostTest") { dependencies { } } getByName("androidDeviceTest") { dependencies { } } } // ... other targets (JVM, iOS, etc.) ... }
ดึงดูด
kotlin { android { namespace = "com.example.kmpfirstlib" compileSdk = 33 minSdk = 24 withJava() // enable java compilation support withHostTestBuilder {}.configure {} withDeviceTestBuilder { it.sourceSetTreeName = "test" } compilerOptions.options.jvmTarget.set( org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8 ) } sourceSets { androidMain { dependencies { } } androidHostTest { dependencies { } } androidDeviceTest { dependencies { } } } // ... other targets (JVM, iOS, etc.) ... }
ใช้การเปลี่ยนแปลง หลังจากใช้ปลั๊กอินและกำหนดค่า
kotlinบล็อกแล้ว ให้ซิงค์โปรเจ็กต์ Gradle เพื่อใช้การเปลี่ยนแปลง
ย้ายข้อมูลจากปลั๊กอินเดิม
คู่มือนี้จะช่วยคุณย้ายข้อมูลจากปลั๊กอิน com.android.library เดิมไปยังปลั๊กอิน com.android.kotlin.multiplatform.library
1. ย้ายแหล่งข้อมูล
ปลั๊กอินเดิมอนุญาตให้คุณใช้ src/main, src/test และ
src/androidTest sourcesets
นอกเหนือจาก src/androidMain, src/androidHostTest และ
src/androidDeviceTest ปลั๊กอินใหม่จะใช้เฉพาะไดเรกทอรีแหล่งที่มาหลังเท่านั้น
ดังนั้นคุณจะต้องย้ายแหล่งที่มาจาก src/main ไปยัง src/androidMain จาก
src/test ไปยัง src/androidHostTest และจาก
src/androidTest ไปยัง src/androidDeviceTest
2. กำหนดค่าไดเรกทอรีแหล่งที่มาและทรัพยากรที่กำหนดเอง
หากมีแหล่งที่มาหรือทรัพยากรในไดเรกทอรีที่ไม่เป็นไปตามมาตรฐาน คุณจะต้องกำหนดค่าโดยใช้บล็อก sourceSets ก่อนหน้านี้ เมื่อใช้ปลั๊กอินใหม่ ให้ใช้ส่วนขยาย
androidComponents เพื่อเพิ่มไดเรกทอรีแหล่งที่มาแบบคงที่ไปยังตัวแปร
โปรดทราบว่าเมื่อใช้ปลั๊กอินใหม่ addStaticSourceDirectory วิธีการ เพิ่ม
ไดเรกทอรีลงในรายการไดเรกทอรีแหล่งที่มาที่มีอยู่ เมื่อใช้ปลั๊กอินเวอร์ชันเดิม เมธอด setSrcDirs จะแทนที่รายการ ส่วนเมธอด srcDir จะเพิ่มรายการ
Android-KMP
เมื่อใช้ปลั๊กอินใหม่ ให้ใช้บล็อก onVariants เพื่อโต้ตอบกับแหล่งที่มาของ
ตัวแปร
// build.gradle.kts
androidComponents {
onVariants { variant ->
// Add a directory for Kotlin sources
variant.sources.kotlin?.addStaticSourceDirectory("other/kotlin")
// Add a directory for Android assets
variant.sources.assets?.addStaticSourceDirectory("other/assets")
}
}
ปลั๊กอินเดิม
เมื่อใช้ปลั๊กอิน com.android.library บล็อก sourceSets จะใช้เพื่อ
ตั้งค่าหรือเพิ่มไดเรกทอรีแหล่งที่มา
// build.gradle.kts
android {
sourceSets {
getByName("main") {
// Replaces the directory for Kotlin sources.
kotlin.setSrcDirs(listOf("other/kotlin"))
// Appends a directory for assets.
assets.srcDir("other/assets")
}
}
}
3. ประกาศทรัพยากร Dependency
งานทั่วไปคือการประกาศการขึ้นต่อกันสำหรับชุดแหล่งที่มาเฉพาะของ Android
ปลั๊กอินใหม่กำหนดให้ต้องวางองค์ประกอบเหล่านี้ไว้ภายในบล็อก sourceSets อย่างชัดเจน
ซึ่งแตกต่างจากบล็อก dependencies ทั่วไปที่ใช้ก่อนหน้านี้
Android-KMP
ปลั๊กอินใหม่นี้ช่วยส่งเสริมโครงสร้างที่สะอาดขึ้นด้วยการจัดกลุ่มทรัพยากร Dependency ของ Android ภายในชุดซอร์ส androidMain นอกจากชุดซอร์สหลักแล้ว
ยังมีชุดซอร์สทดสอบ 2 ชุดซึ่งสร้างขึ้นตามคำขอ
androidDeviceTest และ androidHostTest (ดูข้อมูลเพิ่มเติมได้ที่การกำหนดค่าการทดสอบโฮสต์และอุปกรณ์)
// build.gradle.kts
kotlin {
android {}
//... other targets
sourceSets {
commonMain.dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
}
// Dependencies are now scoped to the specific Android source set
androidMain.dependencies {
implementation("androidx.appcompat:appcompat:1.7.0")
implementation("com.google.android.material:material:1.11.0")
}
}
}
ชุดแหล่งที่มามีการคอมไพเลชัน Kotlin ที่สอดคล้องกันซึ่งมีชื่อว่า main, deviceTest และ hostTest คุณกำหนดค่าชุดแหล่งที่มาและการคอมไพล์ได้ใน
สคริปต์บิลด์ดังนี้
// build.gradle.kts
kotlin {
android {
compilations.getByName("deviceTest") {
kotlinOptions.languageVersion = "2.0"
}
}
}
ปลั๊กอินเดิม
ปลั๊กอินเดิมช่วยให้คุณประกาศการขึ้นต่อกันที่เฉพาะเจาะจงของ Android ใน บล็อกการขึ้นต่อกันระดับบนสุดได้ ซึ่งบางครั้งอาจทำให้เกิดความสับสนใน โมดูลหลายแพลตฟอร์ม
// build.gradle.kts
kotlin {
androidTarget()
//... other targets
}
// Dependencies for all source sets were often mixed in one block
dependencies {
// Common dependencies
commonMainImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
// Android-specific dependencies
implementation("androidx.appcompat:appcompat:1.7.0")
implementation("com.google.android.material:material:1.11.0")
}
4. เปิดใช้ทรัพยากร Android
ระบบไม่ได้เปิดใช้การรองรับทรัพยากร Android (โฟลเดอร์ res) โดยค่าเริ่มต้นด้วย
ปลั๊กอินใหม่เพื่อเพิ่มประสิทธิภาพการสร้าง คุณต้องเลือกใช้เพื่อใช้งาน การเปลี่ยนแปลงนี้ช่วยให้มั่นใจได้ว่าโปรเจ็กต์ที่ไม่ต้องใช้ทรัพยากรเฉพาะของ Android จะไม่ได้รับผลกระทบจากค่าใช้จ่ายในการบิลด์ที่เกี่ยวข้อง
Android-KMP
คุณต้องเปิดใช้การประมวลผลทรัพยากร Android อย่างชัดแจ้ง ควรวางทรัพยากรไว้ใน src/androidMain/res
// build.gradle.kts
kotlin {
android {
// ...
// Enable Android resource processing
androidResources {
enable = true
}
}
}
// Project Structure
// └── src
// └── androidMain
// └── res
// ├── values
// │ └── strings.xml
// └── drawable
// └── icon.xml
ปลั๊กอินเดิม
ระบบจะเปิดใช้การประมวลผลทรัพยากรโดยค่าเริ่มต้น คุณสามารถเพิ่มไดเรกทอรี
res ใน src/main และเริ่มเพิ่ม Drawable, ค่า XML ฯลฯ ได้ทันที
// build.gradle.kts
android {
namespace = "com.example.library"
compileSdk = 34
// No extra configuration was needed to enable resources.
}
// Project Structure
// └── src
// └── main
// └── res
// ├── values
// │ └── strings.xml
// └── drawable
// └── icon.xml
5. กำหนดค่าการทดสอบโฮสต์และอุปกรณ์
โดยค่าเริ่มต้น ปลั๊กอินใหม่จะปิดใช้การทดสอบฝั่งโฮสต์ (หน่วย) และฝั่งอุปกรณ์ (Instrumented) ของ Android คุณต้องเลือกใช้โดยชัดแจ้งเพื่อสร้างชุดแหล่งข้อมูลและการกำหนดค่าทดสอบ ในขณะที่ปลั๊กอินเดิมจะสร้างชุดแหล่งข้อมูลและการกำหนดค่าทดสอบโดยอัตโนมัติ
โมเดลการเลือกใช้นี้ช่วยยืนยันว่าโปรเจ็กต์ของคุณยังคงมีขนาดเล็กและมีเฉพาะตรรกะการสร้างและชุดแหล่งที่มาที่คุณใช้งานอยู่
Android-KMP
ปลั๊กอินใหม่ช่วยให้คุณเปิดใช้และกำหนดค่าการทดสอบภายในบล็อก
kotlin.androidได้ ซึ่งจะทำให้การตั้งค่าชัดเจนยิ่งขึ้นและหลีกเลี่ยง
การสร้างคอมโพเนนต์การทดสอบที่ไม่ได้ใช้ ชุดซอร์ส androidUnitTest จะกลายเป็น
androidHostTest (ไดเรกทอรีทดสอบเปลี่ยนจาก src/androidUnitTest เป็น
src/androidHostTest) และ androidInstrumentedTest จะกลายเป็น
androidDeviceTest (ไดเรกทอรีทดสอบเปลี่ยนจาก
src/androidInstrumentedTest เป็น src/androidDeviceTest)
// build.gradle.kts
kotlin {
android {
// ...
// Opt-in to enable and configure host-side (unit) tests
withHostTest {
isIncludeAndroidResources = true
}
// Opt-in to enable and configure device-side (instrumented) tests
withDeviceTest {
instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
execution = "HOST"
}
}
}
// Project Structure (After Opt-in)
// └── src
// ├── androidHostTest
// └── androidDeviceTest
ปลั๊กอินเดิม
ปลั๊กอิน com.android.library จะสร้างชุดแหล่งที่มา androidUnitTest และ androidInstrumentedTest โดยค่าเริ่มต้น คุณ
กำหนดค่าลักษณะการทำงานของบล็อกภายในandroid โดยปกติจะใช้
testOptions DSL
// build.gradle.kts
android {
defaultConfig {
// Runner was configured in defaultConfig
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
testOptions {
// Configure unit tests (for the 'test' source set)
unitTests.isIncludeAndroidResources = true
// Configure device tests (for the 'androidTest' source set)
execution = "HOST"
}
}
// Project Structure (Defaults)
// └── src
// ├── test
// └── androidTest
6. เปิดใช้การคอมไพล์แหล่งที่มาของ Java
หากไลบรารี KMP ต้องคอมไพล์แหล่งที่มาของ Java สำหรับเป้าหมาย Android คุณ ต้องเปิดใช้ฟังก์ชันนี้อย่างชัดเจนด้วยปลั๊กอินใหม่ โปรดทราบว่าการดำเนินการนี้จะ เปิดใช้การคอมไพล์สำหรับไฟล์ Java ที่อยู่ในโปรเจ็กต์โดยตรง ไม่ใช่สำหรับ การอ้างอิงของไฟล์ นอกจากนี้ วิธีตั้งค่าเวอร์ชันเป้าหมาย JVM ของคอมไพเลอร์ Java และ Kotlin ก็จะเปลี่ยนไปด้วย
Android-KMP
คุณต้องเลือกใช้การคอมไพล์ Java โดยโทรหา withJava() ตอนนี้คุณกำหนดค่าเป้าหมาย JVM
ได้โดยตรงภายในบล็อก kotlin { android {} }
เพื่อให้การตั้งค่าเป็นไปในทิศทางเดียวกันมากขึ้น การตั้งค่า jvmTarget ที่นี่มีผลกับการคอมไพล์ทั้ง Kotlin
และ Java สำหรับเป้าหมาย Android
// build.gradle.kts
kotlin {
android {
// Opt-in to enable Java source compilation
withJava()
// Configure the JVM target for both Kotlin and Java sources
compilerOptions {
jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8)
}
}
// ...
}
// Project Structure:
// └── src
// └── androidMain
// ├── kotlin
// │ └── com/example/MyKotlinClass.kt
// └── java
// └── com.example/MyJavaClass.java
ปลั๊กอินเดิม
ระบบจะเปิดใช้การคอมไพล์ Java โดยค่าเริ่มต้น ตั้งค่าเป้าหมาย JVM สำหรับทั้งแหล่งที่มาของ Java และ Kotlin ในบล็อก android โดยใช้ compileOptions
// build.gradle.kts
android {
// ...
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
kotlin {
androidTarget {
compilations.all {
kotlinOptions.jvmTarget = "1.8"
}
}
}
7. โต้ตอบกับตัวแปรบิลด์โดยใช้ androidComponents
androidComponents ยังคงพร้อมให้ใช้งานสำหรับการโต้ตอบกับอาร์ติแฟกต์บิลด์
โดยใช้โปรแกรม แม้ว่า Variant API ส่วนใหญ่จะยังคงเหมือนเดิม แต่AndroidKotlinMultiplatformVariant อินเทอร์เฟซใหม่จะมีข้อจำกัดมากกว่าเนื่องจากปลั๊กอินจะสร้างได้เพียงตัวแปรเดียว
ดังนั้น พร็อพเพอร์ตี้ที่เกี่ยวข้องกับประเภทบิลด์และผลิตภัณฑ์จึงไม่ พร้อมใช้งานในออบเจ็กต์ตัวแปรอีกต่อไป
Android-KMP
ตอนนี้บล็อก onVariants จะวนซ้ำตัวแปรเดียว คุณยังคงเข้าถึงพร็อพเพอร์ตี้ทั่วไป เช่น name และ artifacts ได้ แต่จะเข้าถึงพร็อพเพอร์ตี้ที่เฉพาะเจาะจงกับประเภทบิลด์ไม่ได้
// build.gradle.kts
androidComponents {
onVariants { variant ->
val artifacts = variant.artifacts
}
}
ปลั๊กอินเดิม
ตัวแปรหลายรายการช่วยให้คุณเข้าถึงพร็อพเพอร์ตี้เฉพาะประเภทบิลด์เพื่อกำหนดค่าทาสก์ได้
// build.gradle.kts
androidComponents {
onVariants(selector().withBuildType("release")) { variant ->
// ...
}
}
8. เลือกตัวแปรของทรัพยากร Dependency ของไลบรารี Android
ไลบรารี KMP จะสร้างตัวแปรเดียวสำหรับ Android อย่างไรก็ตาม คุณอาจ
ต้องใช้ไลบรารี Android มาตรฐาน (com.android.library) ที่มีหลาย
รูปแบบ (เช่น free/paid รสชาติของผลิตภัณฑ์) การควบคุมวิธีที่โปรเจ็กต์
เลือกตัวแปรจาก Dependency นั้นเป็นข้อกำหนดทั่วไป
Android-KMP
ปลั๊กอินใหม่จะรวมและชี้แจงตรรกะนี้ภายในบล็อก kotlin.android.localDependencySelection ซึ่งจะช่วยให้เห็นได้ชัดเจนยิ่งขึ้นว่าระบบจะเลือกการขึ้นต่อภายนอกเวอร์ชันใดสำหรับไลบรารี KMP แบบเวอร์ชันเดียว
// build.gradle.kts
kotlin {
android {
localDependencySelection {
// For dependencies with multiple build types, select 'debug' first, and 'release' in case 'debug' is missing
selectBuildTypeFrom.set(listOf("debug", "release"))
// For dependencies with a 'type' flavor dimension...
productFlavorDimension("type") {
// ...select the 'typeone' flavor.
selectFrom.set(listOf("typeone"))
}
}
}
}
ปลั๊กอินเดิม
คุณกำหนดค่ากลยุทธ์การเลือกทรัพยากร Dependency ภายในบล็อก buildTypes and
productFlavors ซึ่งมักเกี่ยวข้องกับการใช้ missingDimensionStrategy
เพื่อระบุรสชาติเริ่มต้นสำหรับมิติข้อมูลที่ไม่มีในคลัง
หรือ matchingFallbacks ภายในรสชาติที่เฉพาะเจาะจงเพื่อกำหนดลำดับการค้นหา
โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้งาน API ที่หัวข้อแก้ไขข้อผิดพลาดในการจับคู่
9. เพิ่มการอ้างอิงตัวอย่าง Compose
โดยปกติแล้ว เราต้องการให้มีขอบเขตของไลบรารีที่เฉพาะเจาะจงในสภาพแวดล้อมการพัฒนาในเครื่อง เพื่อป้องกันไม่ให้เครื่องมือภายในรั่วไหลไปยังอาร์ติแฟกต์ที่เผยแพร่ขั้นสุดท้าย ซึ่งเป็นความท้าทายสำหรับปลั๊กอิน Android ของ KMP ใหม่ เนื่องจากปลั๊กอินนี้ จะนำสถาปัตยกรรมประเภทบิลด์ที่ใช้เพื่อแยกการพัฒนา การอ้างอิงออกจากโค้ดที่เผยแพร่ออกไป
Android-KMP
หากต้องการเพิ่มทรัพยากร Dependency สำหรับการพัฒนาซอฟต์แวร์และการทดสอบในเครื่องเท่านั้น ให้เพิ่มทรัพยากร Dependency ลงในการกำหนดค่า classpath ของรันไทม์โดยตรง (ในบล็อก dependencies ระดับบนสุด) ของการคอมไพล์ Android หลัก ซึ่งจะช่วยให้มั่นใจได้ว่าทรัพยากร Dependency จะพร้อมใช้งานในขณะรันไทม์ (เช่น สำหรับเครื่องมืออย่างตัวอย่าง Compose) แต่ไม่ได้เป็นส่วนหนึ่งของคลาสพาธการคอมไพล์หรือ API ที่เผยแพร่ของไลบรารี
// build.gradle.kts
dependencies {
"androidRuntimeClasspath"(libs.androidx.compose.ui.tooling)
}
ปลั๊กอินเดิม
โปรเจ็กต์ Kotlin Multiplatform ที่ใช้ปลั๊กอิน com.android.library สำหรับเป้าหมาย Android ควรใช้การกำหนดค่า debugImplementation ซึ่งกำหนดขอบเขตทรัพยากร Dependency ให้กับประเภทบิลด์การแก้ไขข้อบกพร่องและป้องกันไม่ให้รวมไว้ในตัวแปรที่เผยแพร่ของไลบรารีที่ผู้บริโภคใช้
// build.gradle.kts
dependencies {
debugImplementation(libs.androidx.compose.ui.tooling)
}
10. กำหนดค่าเป้าหมาย JVM สำหรับเป้าหมาย KMP Android
ปลั๊กอิน Android KMP จะตั้งค่าเป้าหมาย JVM โดยใช้
android.compilerOptions.jvmTarget ซึ่งใช้ได้กับทั้ง Java และ
Kotlin ทำให้การกำหนดค่าง่ายขึ้นเมื่อเทียบกับบล็อก compileOptions และ kotlinOptions แยกกันในโปรเจ็กต์ Android ล้วน
Android-KMP
เมื่อทำงานกับโปรเจ็กต์ Kotlin Multiplatform (KMP) ที่มีเป้าหมาย Android คุณจะมีหลายวิธีในการกำหนดค่าเวอร์ชันเป้าหมาย JVM สำหรับทั้งคอมไพเลอร์ Kotlin และ Java การทำความเข้าใจขอบเขตและลำดับชั้นของการกำหนดค่าเหล่านี้เป็นกุญแจสำคัญในการจัดการความเข้ากันได้ของไบต์โค้ดของโปรเจ็กต์
ต่อไปนี้คือ 3 วิธีหลักในการตั้งค่าเป้าหมาย JVM โดยเรียงจาก ลำดับความสำคัญต่ำสุดไปสูงสุด ค่าเป้าหมาย JVM ที่มีความสําคัญสูงกว่า จะมีผลกับชุดย่อยของเป้าหมายที่กําหนดค่าไว้และจะลบล้างค่าที่มี ความสําคัญต่ำกว่า ซึ่งหมายความว่าคุณสามารถตั้งค่า JVM เวอร์ชันต่างๆ สําหรับเป้าหมายและการคอมไพล์ต่างๆ ภายในเป้าหมายในโปรเจ็กต์ได้
การใช้ Toolchain ของ Kotlin (ลำดับความสำคัญต่ำสุด)
วิธีที่ทั่วไปที่สุดในการตั้งค่าเป้าหมาย JVM คือการระบุ Toolchain
ในบล็อก kotlin ของไฟล์ build.gradle.kts วิธีนี้จะกำหนดเป้าหมายสำหรับทั้งงานการคอมไพล์ Kotlin และ Java ในเป้าหมายที่อิงตาม JVM ทั้งหมดในโปรเจ็กต์ รวมถึง Android
// build.gradle.kts
kotlin {
jvmToolchain(21)
}
การกำหนดค่านี้ทำให้ทั้ง kotlinc และ javac กำหนดเป้าหมายเป็น JVM 21 ซึ่งเป็นวิธีที่ยอดเยี่ยมในการสร้างพื้นฐานที่สอดคล้องกันสำหรับทั้งโปรเจ็กต์
การใช้ตัวเลือกคอมไพเลอร์ระดับเป้าหมายของ Android (ลำดับความสำคัญปานกลาง)
คุณระบุเป้าหมาย JVM สำหรับเป้าหมาย KMP ของ Android โดยเฉพาะได้
ภายในบล็อก android การตั้งค่านี้จะลบล้างการกำหนดค่า jvmToolchain ทั่วทั้งโปรเจ็กต์และมีผลกับการคอมไพล์ Android ทั้งหมด
// build.gradle.kts
kotlin {
android {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_11)
}
}
}
ในกรณีนี้ แม้ว่าจะตั้งค่า jvmToolchain เป็นเวอร์ชันอื่น แต่ระบบจะคอมไพล์โค้ด Kotlin และ Java ของเป้าหมาย Android เพื่อกำหนดเป้าหมาย JVM 11
การใช้ตัวเลือกคอมไพเลอร์ระดับการคอมไพล์ (ลำดับความสำคัญสูงสุด)
หากต้องการควบคุมแบบละเอียดที่สุด คุณสามารถกำหนดค่าตัวเลือกคอมไพเลอร์ในแต่ละการคอมไพล์ (เช่น ใน androidMain หรือ androidHostTest
เท่านั้น) ซึ่งจะเป็นประโยชน์หากการคอมไพล์ที่เฉพาะเจาะจงต้องกำหนดเป้าหมายเป็น JVM เวอร์ชันอื่น การตั้งค่านี้จะลบล้างทั้ง Toolchain ของ Kotlin และ
ตัวเลือกที่ระดับเป้าหมายของ Android
// build.gradle.kts
kotlin {
android {
compilations.all {
compileTaskProvider.configure {
compilerOptions.jvmTarget.set(JvmTarget.JVM_11)
}
}
}
}
การกำหนดค่านี้ช่วยให้มั่นใจได้ว่าการคอมไพล์ทั้งหมดภายในเป้าหมาย Android จะใช้ JVM 11 ซึ่งให้การควบคุมแบบละเอียด
ปลั๊กอินเดิม
ในโปรเจ็กต์ KMP ที่ใช้ปลั๊กอินไลบรารี Android มาตรฐาน
(com.android.library) การกำหนดค่าจะแตกต่างเล็กน้อยจากเมื่อ
คุณใช้ปลั๊กอิน Android KMP (แต่ในเชิงแนวคิดจะคล้ายกัน)
การใช้ชุดเครื่องมือ Kotlin
เมธอด kotlin.jvmToolchain() จะทำงานในลักษณะเดียวกัน โดยตั้งค่า sourceCompatibility และ targetCompatibility สำหรับ Java และ jvmTarget สำหรับ Kotlin เราขอแนะนำให้ใช้วิธีนี้
// build.gradle.kts
kotlin {
jvmToolchain(21)
}
compileOptions และ kotlinOptions
หากไม่ได้ใช้เครื่องมือ Kotlin คุณจะต้องกำหนดค่าเป้าหมาย JVM โดยใช้บล็อกแยกต่างหากสำหรับ Java และ Kotlin
// build.gradle.kts
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = "11"
}
}
11. เผยแพร่กฎการเก็บของผู้บริโภค
หากไลบรารี KMP ต้องจัดส่งกฎการเก็บรักษาสำหรับผู้บริโภค (เช่น กฎ ProGuard สำหรับ R8) ให้กับผู้บริโภค คุณต้องเปิดใช้การเผยแพร่อย่างชัดแจ้งด้วยปลั๊กอินใหม่ ก่อนหน้านี้ กฎการเก็บรักษาของผู้บริโภคจะได้รับการเผยแพร่โดยค่าเริ่มต้นหากมีการระบุ
Android-KMP
ปลั๊กอินใหม่กำหนดให้คุณต้องตั้งค่า optimization.consumerKeepRules.publish = true และระบุไฟล์กฎ
ภายในบล็อก consumerKeepRules เพื่อเผยแพร่กฎการเก็บรักษาสำหรับผู้บริโภค
// build.gradle.kts
kotlin {
android {
optimization {
consumerKeepRules.apply {
publish = true
file("consumer-proguard-rules.pro")
}
}
}
}
ปลั๊กอินเดิม
เมื่อใช้ com.android.library ระบบจะเผยแพร่ไฟล์กฎที่ระบุด้วย
consumerProguardFiles ใน android.defaultConfig เป็นอาร์ติแฟกต์ของไลบรารีโดยค่าเริ่มต้น
// build.gradle.kts
android {
defaultConfig {
consumerProguardFiles("consumer-proguard-rules.pro")
}
}
12. เผยแพร่ไลบรารีไปยัง Maven
หากคุณวางแผนที่จะเผยแพร่ไลบรารี KMP ไปยัง Maven เพื่อให้โปรเจ็กต์อื่นๆ ใช้ได้ กระบวนการจะแตกต่างกันไปตามว่าคุณใช้ปลั๊กอิน Android-KMP ใหม่หรือปลั๊กอินเดิม
Android-KMP
ปลั๊กอิน com.android.kotlin.multiplatform.library ผสานรวมกับ
กลไกการเผยแพร่ Kotlin Multiplatform มาตรฐาน ไม่จำเป็นต้องมีขั้นตอนเฉพาะสำหรับ Android นอกเหนือจากกระบวนการเผยแพร่ไลบรารี KMP มาตรฐาน
หากต้องการเผยแพร่ไลบรารี ให้ทำตามเอกสารประกอบอย่างเป็นทางการของ JetBrains ดังนี้ ตั้งค่าการเผยแพร่สำหรับไลบรารีแบบหลายแพลตฟอร์ม
ปลั๊กอินเดิม
เมื่อใช้ com.android.library สำหรับเป้าหมาย Android ในโปรเจ็กต์ KMP คุณต้องทำตามคำแนะนำในการเผยแพร่ไลบรารี Android มาตรฐานเพื่อเตรียมและเผยแพร่ Artifact เฉพาะ Android (.aar)
ดูวิธีการอย่างละเอียดได้ที่เตรียมไลบรารีสำหรับการเผยแพร่
เอกสารอ้างอิง API ของปลั๊กอิน
ปลั๊กอินใหม่มี API ที่แตกต่างจาก com.android.library ดูข้อมูลโดยละเอียดเกี่ยวกับ DSL และอินเทอร์เฟซใหม่ได้ที่เอกสารอ้างอิง API
KotlinMultiplatformAndroidLibraryExtensionKotlinMultiplatformAndroidLibraryTargetKotlinMultiplatformAndroidDeviceTestKotlinMultiplatformAndroidHostTestKotlinMultiplatformAndroidVariant
ปัญหาที่ทราบเกี่ยวกับปลั๊กอินไลบรารี Android-KMP
ปัญหาที่ทราบซึ่งอาจเกิดขึ้นเมื่อใช้ปลั๊กอิน com.android.kotlin.multiplatform.library ใหม่มีดังนี้
การแสดงตัวอย่าง Compose ล้มเหลวเมื่อใช้ปลั๊กอิน android-KMP ใหม่
- ได้รับการแก้ไขแล้วใน
Android Studio Otter 2 Feature Drop | 2025.2.2 Canary 3และAndroid Gradle Plugin 9.0.0-alpha13
- ได้รับการแก้ไขแล้วใน
-
- ได้รับการแก้ไขแล้วใน
Android Studio Otter 2 Feature Drop | 2025.2.2 Canary 3และAndroid Gradle Plugin 9.0.0-alpha13
- ได้รับการแก้ไขแล้วใน
-
- ได้รับการแก้ไขแล้วใน
Kotlin Gradle Plugin 2.3.0-Beta2
- ได้รับการแก้ไขแล้วใน
รองรับ instrumented sourceSetTree สำหรับเป้าหมาย androidLibrary
- ได้รับการแก้ไขแล้วใน
Android Studio Otter 2 Feature Drop | 2025.2.2 Canary 3และAndroid Gradle Plugin 9.0.0-alpha13
- ได้รับการแก้ไขแล้วใน
แนะนำสำหรับคุณ
- หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่
- ตั้งค่าสภาพแวดล้อม
- เพิ่มโมดูล KMP ลงในโปรเจ็กต์