Kotlin Multiplatform Mobile — nó là gì, các khái niệm chính và kiến trúc KMM

Tác giả: IT Sectr Đã đăng: 2026-05-02 Thời gian đọc: 9 phút

Kotlin Multiplatform Mobile (KMM) là một công nghệ từ JetBrains để sử dụng mã Kotlin dùng chung trong các ứng dụng iOS và Android, đồng thời giữ nguyên giao diện người dùng native trên mỗi nền tảng. Không giống như các framework hybrid, KMM không sử dụng WebView và không render giao diện thông qua các lớp trừu tượng — logic nghiệp vụ được viết một lần, trong khi giao diện người dùng hoàn toàn native. Theo JetBrains, 2025, KMM được hơn 40.000 nhóm trên toàn thế giới sử dụng. expect/actual là cơ chế chính của Kotlin cho phép khai báo API phụ thuộc nền tảng trong mã dùng chung.

Những điểm chính

  • KMM — công nghệ JetBrains để chia sẻ logic nghiệp vụ giữa iOS và Android bằng Kotlin
  • expect/actual — cơ chế khai báo API nền tảng trong module dùng chung với triển khai cụ thể cho từng nền tảng
  • Giao diện native — giao diện được viết riêng bằng SwiftUI và Jetpack Compose, không cần WebView
  • Module dùng chung — chứa model dữ liệu, yêu cầu mạng, xác thực và quy tắc nghiệp vụ
  • Ktor và Kotlinx — thư viện JetBrains cho kết nối mạng và tuần tự hóa trong mã dùng chung

Kotlin Multiplatform Mobile là gì?

Kotlin Multiplatform Mobile (KMM) là một công nghệ cho phép viết logic nghiệp vụ dùng chung của ứng dụng di động bằng Kotlin và sử dụng trên iOS và Android mà không cần sao chép mã. Không giống như Ionic hay Cordova, KMM không render giao diện trong WebView — giao diện người dùng hoàn toàn native và được viết bằng SwiftUI (iOS) và Jetpack Compose (Android).

KMM được JetBrains công bố vào năm 2019 như một phần của chiến lược Kotlin Multiplatform. Sự khác biệt chính so với các giải pháp đa nền tảng khác là framework không cố gắng hợp nhất giao diện người dùng, mà tập trung vào việc chia sẻ chính xác mã thực sự giống nhau cho cả hai nền tảng: yêu cầu mạng, model dữ liệu, xác thực biểu mẫu, quy tắc nghiệp vụ và thao tác cơ sở dữ liệu.

Theo Khảo sát nhà phát triển JetBrains (2025), KMM được 14% nhà phát triển di động sử dụng và con số này tăng 5% hàng năm. Công nghệ này được lựa chọn bởi các công ty có yêu cầu cao về hiệu suất và trải nghiệm người dùng native, nơi các giải pháp hybrid không được chấp nhận.

Kiến trúc KMM: module dùng chung và triển khai nền tảng

Kiến trúc KMM bao gồm ba module: shared (mã Kotlin chung), iosApp (ứng dụng iOS native bằng Swift) và androidApp (ứng dụng Android native bằng Kotlin). Module dùng chung được biên dịch thành JAR cho Android và framework phổ quát (Apple Framework) cho iOS.

Module dùng chung: những gì được đưa vào mã chung

Module dùng chung chứa tất cả các lớp độc lập với nền tảng: lớp mạng sử dụng Ktor Client, model dữ liệu với tuần tự hóa qua kotlinx.serialization, kho lưu trữ để quản lý dữ liệu, xác thực biểu mẫu và quy tắc nghiệp vụ (ví dụ: tính chi phí giao hàng hoặc kiểm tra quyền truy cập).

Module dùng chung sử dụng Gradle Multiplatform Plugin và chứa ba bộ mã nguồn: commonMain (mã chung), androidMain (triển khai dành riêng cho Android) và iosMain (triển khai dành riêng cho iOS). Trình biên dịch Kotlin/Native biến mã chung thành thư viện native cho iOS, được liên kết với dự án Swift qua XCFramework.

Module nền tảng

Module Android — là ứng dụng Android tiêu chuẩn bằng Kotlin với Jetpack Compose hoặc ViewBinding. Module dùng chung được kết nối như một phụ thuộc Gradle thông thường và tất cả các lớp từ commonMain có thể truy cập trực tiếp.

Module iOS là dự án Xcode bằng Swift hoặc Objective-C. Module dùng chung được kết nối qua CocoaPods, Swift Package Manager hoặc XCFramework. Kotlin/Native tạo tiêu đề Objective-C để xuất các kiểu Kotlin, giúp chúng có thể truy cập từ Swift.

Cơ chế expect/actual trong KMM

expect/actual là cơ chế của Kotlin Multiplatform cho phép khai báo API trong mã dùng chung (khai báo expect) và cung cấp triển khai riêng cho từng nền tảng (khai báo actual). Trình biên dịch đảm bảo rằng actual tồn tại cho mọi nền tảng mục tiêu.

Các trường hợp sử dụng điển hình của expect/actual: lấy thời gian hiện tại với múi giờ, làm việc với SharedPreferences (Android) / UserDefaults (iOS), hàm mã hóa và tạo UUID. Mỗi nền tảng sử dụng API hệ thống riêng của mình.

Nếu không có expect/actual, sẽ không thể có mã logic nghiệp vụ thống nhất, vì API để làm việc với hệ thống tệp, mạng và lưu trữ khác nhau giữa iOS và Android ở cấp độ gọi hệ thống. Cơ chế đảm bảo rằng nhà phát triển không quên triển khai phần dành riêng cho nền tảng.

Đối với các lệnh gọi nền tảng như làm việc với camera hoặc sinh trắc học, KMM cung cấp cơ chế expect/actual kết hợp với plugin tương tự Cordova, nhưng trên Kotlin/Native. JetBrains cũng đã phát hành thư viện kotlinx-datetime, giúp trừu tượng hóa việc xử lý ngày và giờ.

Ví dụ mã KMM

Hãy xem cấu trúc cơ bản của dự án KMM với khai báo hàm expect để tạo UUID và triển khai cho iOS và Android.

kotlin
// commonMain — khai báo chung
expect fun generateUUID(): String

// androidMain — triển khai cho Android
actual fun generateUUID(): String {
    return java.util.UUID.randomUUID().toString()
}

// iosMain — triển khai cho iOS
actual fun generateUUID(): String {
    return platform.Foundation.NSUUID().UUIDString
}

Trong mã dùng chung, expect fun generateUUID() được khai báo. Android sử dụng java.util.UUID, trong khi iOS sử dụng NSUUID từ framework Foundation. Trong phần còn lại của mã module dùng chung, hàm này được gọi bất kể nền tảng nào.

Ví dụ về yêu cầu mạng sử dụng Ktor Client trong mã dùng chung:

kotlin
import io.ktor.client.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import kotlinx.serialization.*
import kotlinx.serialization.json.*

@Serializable
data class User(
    val id: Int,
    val name: String
)

class UserRepository {
    private val client = HttpClient()

    suspend fun getUser(id: Int): User {
        val response: HttpStatement =
            client.get("https://api.example.com/users/$id")
        return Json.decodeFromString(response.bodyAsText())
    }
}

Mã này hoạt động trên cả hai nền tảng mà không cần thay đổi. Ktor Client tự động sử dụng OkHttp trên Android và NSURLSession trên iOS, không cần cấu hình thêm. Tuần tự hóa JSON qua kotlinx.serialization cũng đa nền tảng.

So sánh KMM với Flutter và React Native

KMM chiếm một vị trí độc đáo trong số các công nghệ đa nền tảng, vì nó không cố gắng thay thế giao diện native như Flutter và React Native. KMM là giải pháp để chia sẻ logic, không phải để hợp nhất giao diện.

Tiêu chíKMMFlutterReact Native
UINative (SwiftUI / Jetpack Compose)Công cụ riêng (Skia)JavaScript → Thành phần native
Ngôn ngữKotlin (dùng chung) + Swift / Kotlin (UI)DartJavaScript / TypeScript
Hiệu suấtTối đa (UI native)Cao (kết xuất riêng)Trung bình (cầu nối JS-Native)
Chia sẻ mãLogic nghiệp vụ (40–70%)UI + logic (80–95%)UI + logic (70–90%)
Rào cản gia nhậpCao (hai ngôn ngữ)Trung bình (một ngôn ngữ)Thấp (nhà phát triển web)

Lợi thế chính của KMM là kiểm soát hoàn toàn giao diện người dùng. Nếu ứng dụng cần hiển thị và hoạt động native trên mỗi nền tảng (ví dụ: sử dụng TabBar iOS và BottomNavigation Android với hiệu ứng hoạt hình nền tảng), KMM là giải pháp đa nền tảng duy nhất cung cấp điều này mà không cần giải pháp tạm thời.

Nhược điểm là nhóm phải thành thạo đồng thời Kotlin, Swift, Jetpack Compose và SwiftUI, điều này làm phức tạp việc tuyển dụng. Flutter và React Native chỉ yêu cầu kiến thức về một ngôn ngữ và một framework.

Lợi ích và thách thức khi áp dụng KMM

Kotlin Multiplatform Mobile là một công nghệ mạnh mẽ, nhưng việc áp dụng nó đòi hỏi một cách tiếp cận cân bằng. Hãy xem xét những lợi ích chính và những thách thức điển hình mà các nhóm phải đối mặt.

Lợi ích của KMM

Lợi ích đầu tiên và quan trọng nhất là giảm trùng lặp mã. Theo Nghiên cứu điển hình của JetBrains (2024), các nhóm áp dụng KMM giảm 60–80% mã trùng lặp cho lớp mạng và 40–50% cho toàn bộ logic nghiệp vụ. Điều này ảnh hưởng trực tiếp đến tốc độ phát triển và số lượng lỗi.

Lợi ích thứ hai là hiệu suất ngang với ứng dụng native. Không giống như framework hybrid, KMM không thêm lớp trừu tượng giữa giao diện người dùng và hệ thống. Mã logic nghiệp vụ chạy nhanh như được viết bằng Swift hoặc Kotlin cho từng nền tảng riêng biệt.

Thách thức khi áp dụng

Thách thức chính là trình độ của nhóm. Các nhà phát triển cần biết Kotlin (cho module dùng chung), cũng như Swift và Jetpack Compose (cho giao diện người dùng). Rất khó để tìm một chuyên gia toàn năng, vì vậy các nhóm thường bao gồm nhà phát triển Android và iOS cùng nhau duy trì module dùng chung.

Thách thức thứ hai là công cụ. KMM yêu cầu cấu hình Gradle, CocoaPods hoặc Swift Package Manager, cũng như tích hợp với Xcode. Trong giai đoạn đầu của dự án, các vấn đề về cấu hình build thường gặp, đặc biệt khi làm việc với thư viện C.

Thách thức thứ ba là gỡ lỗi. Khi lỗi xảy ra tại điểm giao nhau giữa Kotlin/Native và Swift, việc xác định nguyên nhân khó hơn so với ứng dụng monolithic. JetBrains liên tục cải thiện công cụ gỡ lỗi, nhưng trên thực tế, các nhóm dành tới 20% thời gian cho các tác vụ cơ sở hạ tầng.

Câu hỏi thường gặp

Có thể sử dụng KMM cho iOS mà không cần Android không?

Có, KMM hỗ trợ iOS là nền tảng mục tiêu duy nhất. Module dùng chung được biên dịch thành framework iOS được liên kết với dự án Swift qua XCFramework. Không cần tạo module Android. Điều này hữu ích cho các nhóm muốn sử dụng Kotlin cho logic nghiệp vụ của ứng dụng iOS.

KMM khác Kotlin/Native như thế nào?

Kotlin/Native là trình biên dịch chuyển đổi mã Kotlin thành tệp nhị phân native mà không cần máy ảo. KMM sử dụng Kotlin/Native để biên dịch module dùng chung cho iOS. Cho Android, KMM sử dụng trình biên dịch Kotlin/JVM tiêu chuẩn. Kotlin/Native là nền tảng công nghệ của KMM.

KMM làm việc với cơ sở dữ liệu như thế nào?

Để làm việc với cơ sở dữ liệu cục bộ trong KMM, SQLDelight được sử dụng — thư viện đa nền tảng tạo mã Kotlin từ truy vấn SQL. Trên Android, nó hoạt động qua Android SQLite API; trên iOS qua SQLite native (CFNetwork). Một giải pháp thay thế là Realm Kotlin SDK từ MongoDB.

KMM có hỗ trợ thành phần giao diện người dùng không?

KMM không bao gồm thành phần giao diện người dùng theo mặc định — giao diện được viết riêng bằng SwiftUI và Jetpack Compose. Tuy nhiên, có các thư viện như Compose Multiplatform (từ JetBrains) cho phép kết xuất giao diện người dùng bằng Kotlin trực tiếp trên iOS và Android mà không cần framework native.

Những công ty nào sử dụng KMM trong sản xuất?

KMM được sử dụng bởi các công ty lớn: Netflix (chia sẻ logic đề xuất), McDonald's (ứng dụng di động), VMWare (ứng dụng doanh nghiệp) và Leroy Merlin (ứng dụng vật liệu xây dựng). Danh sách đang tăng lên khi JetBrains tích cực đầu tư vào phát triển hệ sinh thái.

Tổng kết

  • KMM — công nghệ JetBrains để chia sẻ logic nghiệp vụ giữa iOS và Android bằng Kotlin với giao diện native
  • Kiến trúc bao gồm module dùng chung và triển khai nền tảng qua expect/actual
  • Module dùng chung chứa kết nối mạng (Ktor), model (kotlinx.serialization) và quy tắc nghiệp vụ
  • expect/actual — cơ chế chính cho triển khai phụ thuộc nền tảng trong mã dùng chung
  • Hiệu suất ngang ứng dụng native vì giao diện không sử dụng lớp trừu tượng
  • Thách thức bao gồm yêu cầu trình độ nhóm cao và thiết lập cơ sở hạ tầng build
  • Chọn KMM phù hợp cho các dự án nơi trải nghiệm native và tỷ lệ chia sẻ logic cao là quan trọng

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm