0Pricing
Kotlin Academy · บทเรียน

โครงสร้างโปรเจกต์ 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 Logger

iosMain: เฉพาะ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. โครงสร้างโปรเจกต์ KMP: commonMain, androidMain, iosMain
  2. กลไก expect/actual สำหรับ API ของแพลตฟอร์ม
  3. การแชร์ชั้น Repository และ Use Case
  4. การฉีดการพึ่งพาใน KMP ด้วย Koin
← กลับไปที่ Kotlin Academy