Kotlin Multiplatform: คืออะไร, shared module และ expect/actual

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-02-11 เวลาอ่าน: 11 นาที

Kotlin Multiplatform (KMP) คือเทคโนโลยีของ JetBrains ที่คอมไพล์โค้ด Kotlin ที่ใช้ร่วมกันสำหรับ iOS, Android, Web และ Desktop ต่างจาก Flutter และ React Native ตรงที่ KMP ไม่ได้แทนที่ UI ดั้งเดิม — โลจิกที่ใช้ร่วมกันจะถูกแยกไปยัง shared module ในขณะที่อินเทอร์เฟซของแต่ละแอปยังคงเป็นแบบดั้งเดิม Kotlin Multiplatform documentation — ข้อมูลอ้างอิงหลักสำหรับการกำหนดค่าโมดูลและกลไก expect/actual

ประเด็นสำคัญ

  • KMP — โลจิกที่ใช้ร่วมกันใน Kotlin พร้อม expect/actual สำหรับ API ของแพลตฟอร์มโดยไม่ต้องแทนที่ UI ดั้งเดิม
  • Shared module — โมดูล Gradle ที่มีโค้ดเครือข่าย ฐานข้อมูล การตรวจสอบ และโลจิกทางธุรกิจสำหรับทุกแพลตฟอร์ม
  • Expect/actual — กลไกในการประกาศ API ของแพลตฟอร์มในโค้ดที่ใช้ร่วมกันพร้อมการนำไปใช้สำหรับแต่ละเป้าหมาย
  • การรวม iOS — shared module ถูกคอมไพล์เป็น Apple framework ผ่าน Kotlin/Native
  • KMP vs KMM — Kotlin Multiplatform Mobile (เน้นมือถือ) ตอนนี้เป็นส่วนหนึ่งของ Kotlin Multiplatform

Kotlin Multiplatform คืออะไร?

Kotlin Multiplatform คือเทคโนโลยีการคอมไพล์ข้ามแพลตฟอร์มที่ช่วยให้เขียนโค้ดที่ใช้ร่วมกันใน Kotlin และคอมไพล์สำหรับแพลตฟอร์มต่าง ๆ: JVM (Android), LLVM (iOS, macOS, watchOS), JavaScript (Web) และไบนารีดั้งเดิม (Linux, Windows) KMP ไม่ใช่เฟรมเวิร์ก UI — มันแก้ปัญหาการนำโลจิกทางธุรกิจกลับมาใช้ใหม่ ไม่ใช่อินเทอร์เฟซ

สถาปัตยกรรม KMP สร้างขึ้นรอบ shared module — โมดูล Gradle ที่มี commonMain พร้อมโค้ดที่ไม่ขึ้นกับแพลตฟอร์มและ source sets สำหรับแต่ละเป้าหมาย (androidMain, iosMain, desktopMain) ตามข้อมูลของ JetBrains ปี 2025 กว่า 40% ของโปรเจกต์ Kotlin ใหม่ใช้ KMP เพื่อแชร์โค้ดระหว่างแพลตฟอร์ม

Kotlin Multiplatform Mobile (KMM) — ชื่อเดิมสำหรับสถานการณ์มือถือ iOS+Android ตั้งแต่ Kotlin 2.1+ คำว่า KMM ถูกแทนที่ด้วย Kotlin Multiplatform เนื่องจากเทคโนโลยีก้าวข้ามการพัฒนามือถือ Netflix, McDonald's และ VMware ใช้ KMP ในระบบผลิตเพื่อแชร์โค้ดระหว่างแอปพลิเคชันมือถือ

กลไก expect/actual: สถาปัตยกรรม

Expect/actual — กลไกสำคัญของ KMP สำหรับการทำงานกับโค้ดเฉพาะแพลตฟอร์ม ใน commonMain มีการประกาศ expect declaration (ฟังก์ชัน, คลาส, พร็อพเพอร์ตี้) และในแต่ละ source set เฉพาะแพลตฟอร์ม (androidMain, iosMain) จะมีการนำไปใช้แบบ actual คอมไพเลอร์จะตรวจสอบว่าสำหรับแต่ละ expect มี actual ในแต่ละแพลตฟอร์มเป้าหมาย

kotlin
// commonMain — การประกาศ API ของแพลตฟอร์ม
expect fun getPlatformName(): String

expect class PlatformContext(val appVersion: String)

// androidMain — actual สำหรับ Android
actual fun getPlatformName(): String = "Android \${Build.VERSION.SDK_INT}"

// iosMain — actual สำหรับ iOS
actual fun getPlatformName(): String =
    UIDevice.currentDevice.systemName

ลำดับชั้นของ source sets ใน KMP ช่วยให้สร้างระดับกลางได้: ตัวอย่างเช่น iosArm64Main (อุปกรณ์ iOS จริง) และ iosSimulatorArm64Main (ซิมูเลเตอร์) พร้อม iosMain ที่ใช้ร่วมกัน โค้ดจาก commonMaster พร้อมใช้งานสำหรับทุกแพลตฟอร์ม ในขณะที่โค้ดจาก iosMain พร้อมใช้งานเฉพาะเป้าหมาย iOS เท่านั้น ซึ่งช่วยลดความซ้ำซ้อนเมื่อการนำไปใช้แตกต่างกันไม่ใช่ในแต่ละแพลตฟอร์ม แต่สำหรับกลุ่มของแพลตฟอร์ม

ในทางปฏิบัติ expect/actual ใช้สำหรับ: การเข้าถึงพื้นที่เก็บข้อมูลในเครื่อง (SharedPreferences vs NSUserDefaults), เครือข่าย (HttpEngine ต่อแพลตฟอร์ม), การเข้าถึงระบบไฟล์, การเข้ารหัส และการวิเคราะห์ JetBrains แนะนำให้ลดจำนวนการประกาศ expect/actual และย้ายโค้ดให้มากที่สุดเท่าที่เป็นไปได้ไปยัง commonMain

Shared module: โครงสร้างและ Gradle

Shared module — โมดูล Gradle มาตรฐานที่มีปลั๊กอิน org.jetbrains.kotlin.multiplatform ประกอบด้วยโค้ดที่ใช้ร่วมกันใน src/commonMain/kotlin/ และการนำไปใช้เฉพาะแพลตฟอร์มใน src/androidMain/kotlin/ และ src/iosMain/kotlin/ โปรเจกต์ KMP ยังรวม androidApp และ iosApp ซึ่งขึ้นอยู่กับ shared module

kotlin
// build.gradle.kts — shared module
plugins {
    kotlin("multiplatform")
    id("com.android.library")
}

kotlin {
    androidTarget()
    
    listOf(
        iosX64(),
        iosArm64(),
        iosSimulatorArm64()
    ).forEach {
        it.binaries.framework {
            baseName = "shared"
            isStatic = true
        }
    }

    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("io.ktor:ktor-client-core:3.1.0")
                implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
            }
        }
        val androidMain by getting {
            dependencies {
                implementation("io.ktor:ktor-client-okhttp:3.1.0")
            }
        }
        val iosMain by creating {
            dependencies {
                implementation("io.ktor:ktor-client-darwin:3.1.0")
            }
        }
    }
}

การกำหนดค่า Gradle สำหรับ KMP ต้องการการประกาศเป้าหมาย iOS อย่างชัดเจน — x64 (ซิมูเลเตอร์ Intel), arm64 (อุปกรณ์จริง) และ simulatorArm64 (ซิมูเลเตอร์ Apple Silicon) Apple framework ที่แยกต่างหากจะถูกสร้างขึ้นสำหรับแต่ละเป้าหมาย ปลั๊กอิน kotlin("multiplatform") จะกำหนดการคอมไพล์สำหรับ JVM และ LLVM โดยอัตโนมัติตามเป้าหมายที่ประกาศไว้

Ktor และ kotlinx.serialization — ไลบรารี KMP มาตรฐานที่รองรับโค้ดที่ใช้ร่วมกัน Ktor ให้ไคลเอนต์ HTTP พร้อมเอ็นจินสำหรับแต่ละแพลตฟอร์ม (OkHttp สำหรับ Android, Darwin สำหรับ iOS) kotlinx.serialization ทำงานบนทุกแพลตฟอร์มโดยไม่ต้องใช้ expect/actual ต้องขอบคุณการนำไปใช้แบบหลายแพลตฟอร์มใน commonMain

การรวม iOS ผ่าน Kotlin/Native

Kotlin/Native — คอมไพเลอร์ Kotlin สำหรับโค้ดดั้งเดิมผ่าน LLVM สำหรับ iOS shared module จะถูกคอมไพล์เป็น Apple framework (.framework) ที่เชื่อมต่อผ่าน Xcode การเรียกโค้ดที่ใช้ร่วมกันจาก Swift/Objective-C เกิดขึ้นผ่านส่วนหัว Objective-C ที่สร้างขึ้น ดังนั้น API ของ shared module จะต้องเข้ากันได้กับ Objective-C

ข้อจำกัดของการรวม iOS: คอลเลกชัน Kotlin (List, Map) จะถูกแปลงเป็น NSArray/NSDictionary ฟังก์ชันที่มีพารามิเตอร์เริ่มต้นจะไม่ถูกส่งออก — จำเป็นต้องมี overloads สำหรับฟังก์ชัน suspend เมธอดแบบ callback จะถูกสร้างขึ้นพร้อม @ObjCName และการรองรับ async/await ตั้งแต่ Kotlin 2.0+

swift
// แอป iOS: การเรียก shared module จาก Swift
import shared

class ViewModel: ObservableObject {
    let repository = UserRepository()
    
    func loadUsers() {
        repository.fetchUsers(completionHandler: { result, error in
            if let users = result as? [User] {
                print("Users: \(users.count)")
            }
        })
    }
}

การรวม shared module ใน Xcode เกิดขึ้นผ่าน embed-and-framework — .xcframework ที่สร้างขึ้นจะถูกเพิ่มลงในโปรเจกต์ Xcode ปลั๊กอิน Gradle สามารถอัปเดต framework โดยอัตโนมัติระหว่างการ build ผ่าน embedAndSignAppleFrameworkForXcode สำหรับการทดสอบบนซิมูเลเตอร์ ไบนารี iosSimulatorArm64 หรือ iosX64 ก็เพียงพอ

KMP vs Flutter vs React Native

การเลือกระหว่าง KMP, Flutter และ React Native ขึ้นอยู่กับลำดับความสำคัญ: การนำโค้ดกลับมาใช้ใหม่หรือข้ามแพลตฟอร์มแบบเต็มรูปแบบ KMP ให้ UI ดั้งเดิมบนแต่ละแพลตฟอร์มแต่ต้องการฐานโค้ดสองชุดสำหรับอินเทอร์เฟซ Flutter และ React Native ใช้ UI เดียวแต่เสียสละความเป็นดั้งเดิม

คุณลักษณะKMPFlutterReact Native
เฟรมเวิร์ก UIดั้งเดิม (Android XML/Jetpack Compose + SwiftUI)Dart + ตัวเรนเดอร์ Skia ของตัวเองReact + คอมโพเนนต์ดั้งเดิม
โค้ดที่ใช้ร่วมกันโลจิกทางธุรกิจ เครือข่าย DB การตรวจสอบ100% ยกเว้นปลั๊กอินดั้งเดิม100% ยกเว้นโมดูลดั้งเดิม
ประสิทธิภาพดั้งเดิม (ไม่มีชั้นกลาง)สูง (Skia Engine)ปานกลาง (JSI Bridge)
การรองรับ iOSKotlin/Native (ยอดเยี่ยม)ยอดเยี่ยมดี
อุปสรรคในการเริ่มต้นปานกลาง (Kotlin + แพลตฟอร์มดั้งเดิม)ต่ำ (หนึ่งภาษา + หนึ่ง UI)ต่ำ (JS/TS + React)

เมื่อใดควรเลือก KMP: โปรเจกต์ต้องการ UI ที่มีประสิทธิภาพสูง (เกม แผนที่ แอนิเมชัน) ต้องนำโค้ดดั้งเดิมที่มีอยู่กลับมาใช้ใหม่ ทีมรู้จัก Kotlin และแพลตฟอร์มดั้งเดิมอยู่แล้ว เมื่อใดควรเลือก Flutter/RN: MVP หรือสตาร์ทอัพที่มีงบประมาณจำกัด ทีมโปรไฟล์เดียว UI ไม่ต้องการการปรับแต่งดั้งเดิมเชิงลึก

เครื่องมือและไลบรารี KMP

ระบบนิเวศเครื่องมือ KMP รวมถึงไลบรารีสำหรับทุกชั้นของแอปพลิเคชัน: เครือข่าย (Ktor), การทำให้เป็นอนุกรม (kotlinx.serialization), ฐานข้อมูล (SQLDelight), การนำทาง (Decompose), DI (Koin) และการจัดเก็บข้อมูล (multiplatform-settings) JetBrains รองรับ Compose Multiplatform — เฟรมเวิร์ก UI ใน Kotlin ที่ทำงานบนทุกแพลตฟอร์ม

kotlin
// พื้นที่เก็บข้อมูล KMP พร้อม SQLDelight + Ktor
class UserRepository(
    private val httpClient: HttpClient,
    private val db: AppDatabase
) {
    suspend fun syncUsers(): List<User> {
        val remote = httpClient.get("https://api.example.com/users")
            .body<List<UserDto>>()
        
        db.userQueries.replaceAll(remote.map { it.toDomain() })
        
        return db.userQueries.selectAll().executeAsList()
    }
}

Compose Multiplatform — เฟรมเวิร์ก UI สำหรับ KMP ที่อิงจาก Jetpack Compose ช่วยให้เขียนอินเทอร์เฟซใน Kotlin สำหรับ Android, iOS, Desktop และ Web ในปี 2025 Compose Multiplatform บรรลุสถานะเสถียรสำหรับ Android และ Desktop; เป้าหมาย iOS อยู่ในรุ่นเบต้า สำหรับโปรเจกต์การผลิตที่มี UI ดั้งเดิม ข้อได้เปรียบของ KMP ยังคงเป็นความแตกต่างหลักจาก Flutter

คำถามที่พบบ่อย

Kotlin Multiplatform แตกต่างจาก Kotlin Multiplatform Mobile อย่างไร?

KMM — สถานการณ์มือถือของ KMP สำหรับ iOS และ Android ตั้งแต่ Kotlin 2.1+ JetBrains ได้รวมทั้งสองคำศัพท์เป็น Kotlin Multiplatform เนื่องจากเทคโนโลยีรองรับไม่เพียงแค่แพลตฟอร์มมือถือ แต่ยังรวมถึง Desktop และ Web โปรเจกต์ KMM ยังคงทำงานได้ แต่ตอนนี้เป็นส่วนหนึ่งของ KMP โดยรวม

สามารถใช้ KMP กับ SwiftUI ได้หรือไม่?

ได้ KMP ถูกคอมไพล์เป็น Apple framework ผ่าน Kotlin/Native พร้อมส่วนหัว Objective-C SwiftUI นำเข้า framework นี้เหมือนไลบรารีทั่วไป Shared module ส่งออกคลาสและฟังก์ชัน Kotlin ที่ถูกเรียกจาก Swift โดยมีข้อจำกัดบางประการ (ตัวอย่างเช่น คอลเลกชัน Kotlin จะถูกแปลงเป็นชนิด Foundation)

จะทดสอบ shared module บน iOS ได้อย่างไร?

บน iOS shared module จะถูกทดสอบผ่านการทดสอบ Kotlin/Native ใน source set iosTest สำหรับการทดสอบ UI จะใช้ XCTest ใน Xcode พร้อม framework ที่นำเข้า การทดสอบ Kotlin เขียนใน commonTest ด้วย kotlin.test และทำงานบนซิมูเลเตอร์ iOS ผ่านงาน Gradle iosSimulatorArm64Test

ไลบรารีใดบ้างที่พร้อมใช้งานใน KMP?

ไลบรารี KMP หลัก: Ktor (เครือข่าย), kotlinx.serialization (JSON), SQLDelight (DB), Koin (DI), Decompose (การนำทาง), multiplatform-settings (SharedPreferences/NSUserDefaults), Apollo GraphQL, Firebase (ผ่าน KMP-NativeCoroutines) Compose Multiplatform ให้ UI สำหรับทุกแพลตฟอร์ม

KMP รองรับ Gradle 8 หรือไม่?

ใช่ KMP เข้ากันได้อย่างสมบูรณ์กับ Gradle 8.5+ ตั้งแต่ Kotlin 2.1 ปลั๊กอินอย่างเป็นทางการรองรับ Gradle 8 การกำหนดค่าผ่าน build.gradle.kts ด้วย kotlin("multiplatform") ต้องการ Gradle 7.6+ แต่แนะนำเวอร์ชัน 8.5 สำหรับประสิทธิภาพการ build ที่ดีที่สุด

สรุป

  • Kotlin Multiplatform — เทคโนโลยีข้ามแพลตฟอร์มของ JetBrains สำหรับโค้ดที่ใช้ร่วมกันโดยไม่ต้องแทนที่ UI ดั้งเดิม
  • Expect/actual — กลไกในการประกาศ API ของแพลตฟอร์มใน commonMain พร้อมการนำไปใช้สำหรับแต่ละเป้าหมาย
  • Shared module — โมดูล Gradle พร้อม commonMain และ source sets เฉพาะแพลตฟอร์ม (androidMain, iosMain)
  • Kotlin/Native คอมไพล์ shared module เป็น Apple framework ที่เรียกได้จาก Swift และ Objective-C
  • KMP vs Flutter/RN — การนำโลจิกกลับมาใช้ใหม่ + UI ดั้งเดิม เทียบกับฐานโค้ดเดียวและ UI
  • Compose Multiplatform — เฟรมเวิร์ก UI ใน Kotlin สำหรับ Android, iOS, Desktop และ Web
  • ระบบนิเวศ — Ktor, SQLDelight, Koin, kotlinx.serialization, Decompose สำหรับทุกชั้นของแอปพลิเคชัน

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม