โครงสร้างโปรเจกต์ KMP: commonMain, androidMain, iosMain
ทำความเข้าใจลำดับชั้นของชุดซอร์สและวิธีแชร์โค้ดข้ามเป้าหมาย
โครงสร้างโปรเจกต์ KMP: commonMain, androidMain, iosMain เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
KMP คืออะไร
Kotlin Multiplatform (KMP) ช่วยให้คุณเขียนโค้ด Kotlin ที่ใช้ร่วมกัน ซึ่งคอมไพล์เป็น JVM, Android, iOS (ผ่าน Kotlin/Native) และ JS ได้ โค้ดเฉพาะแพลตฟอร์มจะอยู่ในชุดซอร์สแยกกัน
// Typical KMP module structure:
// shared/
// src/
// commonMain/kotlin/ <- shared code
// androidMain/kotlin/ <- Android-only
// iosMain/kotlin/ <- iOS-only
// commonTest/kotlin/ <- shared tests
fun main() { println("KMP: one codebase, many targets") }ลำดับชั้นของชุดซอร์ส
ชุดซอร์สมีลำดับชั้น โดย commonMain เป็นราก ส่วน androidMain และ iosMain พึ่งพาชุดซอร์สนี้ โค้ดใน commonMain จะมองเห็นได้จากเป้าหมายทั้งหมด
// build.gradle.kts (Kotlin DSL)
kotlin {
androidTarget()
iosX64()
iosArm64()
iosSimulatorArm64()
sourceSets {
val commonMain by getting {
dependencies { /* shared deps */ }
}
val androidMain by getting
val iosMain by getting
}
}ตรรกะที่ใช้ร่วมกันใน commonMain
ใส่ตรรกะทางธุรกิจ โมเดลโดเมน รีโพซิทอรี และกรณีใช้งานไว้ใน commonMain โค้ดส่วนนี้จะคอมไพล์สำหรับเป้าหมายทั้งหมด
// commonMain/kotlin/com/example/domain/User.kt
data class User(val id: String, val name: String, val email: String)
// commonMain/kotlin/com/example/repository/UserRepository.kt
interface UserRepository {
suspend fun getUser(id: String): User?
suspend fun saveUser(user: User)
}androidMain: เฉพาะ Android
androidMain สามารถใช้คลาสจาก Android SDK ได้ การใช้งานทั่วไปคือการสร้างการใช้งานเฉพาะ Android สำหรับการประกาศ expect/actual
// androidMain/kotlin/com/example/platform/PlatformLogger.kt
import android.util.Log
class AndroidLogger : Logger {
override fun log(msg: String) = Log.d("App", msg)
}
// androidMain/kotlin/com/example/di/PlatformModule.kt
// Koin or Hilt module that binds AndroidLogger to LoggeriosMain: เฉพาะ iOS
iosMain เข้าถึงเฟรมเวิร์กของ Apple ได้ผ่านการทำงานร่วมกันของ Kotlin/Native ใช้ชุดซอร์สนี้สำหรับการใช้งาน API แบบ expect/actual บน iOS
// iosMain/kotlin/com/example/platform/PlatformLogger.kt
import platform.Foundation.NSLog
class IosLogger : Logger {
override fun log(msg: String) = NSLog(msg)
}
// iOS uses Kotlin/Native runtime; no JVM hereการกำหนดค่า Gradle สำหรับเป้าหมาย iOS
สำหรับ iOS โดยทั่วไปคุณจะประกาศเป้าหมายสามแบบ ได้แก่ x64 (ตัวจำลองบน Intel), arm64 (อุปกรณ์) และ simulatorArm64 (ตัวจำลองบน Apple Silicon)
// build.gradle.kts
kotlin {
iosX64()
iosArm64()
iosSimulatorArm64()
sourceSets {
val iosMain by creating {
dependsOn(commonMain.get())
}
val iosX64Main by getting { dependsOn(iosMain) }
val iosArm64Main by getting { dependsOn(iosMain) }
val iosSimulatorArm64Main by getting { dependsOn(iosMain) }
}
}การพึ่งพาที่ใช้ร่วมกันใน commonMain
เพิ่มการพึ่งพาที่ใช้ร่วมกัน (Ktor, SQLDelight, kotlinx.serialization, Koin) ลงใน commonMain ส่วนไดรเวอร์เฉพาะแพลตฟอร์มให้ใส่ไว้ในชุดซอร์สของแพลตฟอร์มนั้น
// commonMain dependencies example:
// implementation("io.ktor:ktor-client-core:2.3.0")
// implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1")
// implementation("io.insert-koin:koin-core:3.4.0")
// androidMain:
// implementation("io.ktor:ktor-client-okhttp:2.3.0")
// iosMain:
// implementation("io.ktor:ktor-client-darwin:2.3.0")commonTest: การทดสอบที่ใช้ร่วมกัน
การทดสอบใน commonTest จะทำงานบนเป้าหมายทั้งหมด ใช้ไลบรารีทดสอบของ Kotlin และเขียนการทดสอบหน่วยที่ไม่ขึ้นกับเป้าหมายสำหรับตรรกะทางธุรกิจที่ใช้ร่วมกัน
// commonTest/kotlin/UserRepositoryTest.kt
import kotlin.test.Test
import kotlin.test.assertEquals
class UserRepositoryTest {
@Test
fun testUserCreation() {
val user = User("1", "Alice", "alice@example.com")
assertEquals("Alice", user.name)
}
}ชุดซอร์สระดับกลาง
คุณสามารถสร้างชุดซอร์สระดับกลางที่ใช้ร่วมกันระหว่างเป้าหมายบางส่วนได้ เช่น nativeMain สำหรับเป้าหมายแบบเนทีฟทั้งหมด หรือ appleMain สำหรับ iOS กับ macOS
// Create appleMain shared between iOS and macOS:
sourceSets {
val appleMain by creating { dependsOn(commonMain.get()) }
val iosMain by getting { dependsOn(appleMain) }
val macosMain by getting { dependsOn(appleMain) }
}โครงสร้างไฟล์โปรเจกต์
แผนผังไดเรกทอรีของโมดูลที่ใช้ร่วมกันของ KMP โดยทั่วไป ซึ่งแยกความรับผิดชอบต่าง ๆ อย่างชัดเจน
// shared/
// build.gradle.kts
// src/
// commonMain/kotlin/
// domain/ User.kt, Post.kt
// repository/ UserRepository.kt
// usecase/ GetUserUseCase.kt
// androidMain/kotlin/
// repository/ RoomUserRepository.kt
// iosMain/kotlin/
// repository/ CoreDataUserRepository.kt
// commonTest/kotlin/ GetUserUseCaseTest.ktการผสานรวม CocoaPods / SPM
ปลั๊กอิน Gradle ของ KMP จะสร้าง XCFramework (หรือพ็อด CocoaPods) ที่คุณนำไปเพิ่มในโปรเจกต์ Xcode ได้ โดยเปิดเผยโค้ด Kotlin ที่ใช้ร่วมกันในรูปแบบเฟรมเวิร์กเนทีฟ
// build.gradle.kts for CocoaPods:
kotlin {
cocoapods {
name = "Shared"
version = "1.0"
ios.deploymentTarget = "14.0"
framework { baseName = "Shared" }
}
}
// Run: ./gradlew :shared:podPublishReleaseXCFrameworkตรวจสอบความเข้าใจ
ตรรกะทางธุรกิจที่ใช้ร่วมกัน (โมเดลโดเมน กรณีใช้งาน) ควรอยู่ที่ใดในโปรเจกต์ KMP
สรุปทบทวน
commonMain เก็บตรรกะที่ใช้ร่วมกัน (โดเมน รีโพซิทอรี กรณีใช้งาน) ส่วน androidMain/iosMain เก็บการใช้งานเฉพาะแพลตฟอร์ม และ commonTest จะทำการทดสอบบนเป้าหมายทั้งหมด การพึ่งพาถูกแยกเป็นสองส่วน ได้แก่ API ที่ใช้ร่วมกันใน commonMain และไดรเวอร์แพลตฟอร์มในชุดซอร์สของแต่ละแพลตฟอร์ม
คำถามที่พบบ่อย
บทเรียน “โครงสร้างโปรเจกต์ KMP: commonMain, androidMain, iosMain” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “โครงสร้างโปรเจกต์ KMP: commonMain, androidMain, iosMain” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “โครงสร้างโปรเจกต์ KMP: commonMain, androidMain, iosMain”
ทำความเข้าใจลำดับชั้นของชุดซอร์สและวิธีแชร์โค้ดข้ามเป้าหมาย คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “โครงสร้างโปรเจกต์ KMP: commonMain, androidMain, iosMain” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม
ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โครงสร้างโปรเจกต์ KMP: commonMain, androidMain, iosMain
- กลไก expect/actual สำหรับ API ของแพลตฟอร์ม
- การแชร์ชั้น Repository และ Use Case
- การฉีดการพึ่งพาใน KMP ด้วย Koin