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
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 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 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 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.
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ờ.
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.
// 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:
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.
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í | KMM | Flutter | React Native |
|---|---|---|---|
| UI | Native (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) | Dart | JavaScript / TypeScript |
| Hiệu suất | Tố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ập | Cao (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.
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 đầ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 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ó, 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.
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.
Để 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 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.
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
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.
Đọc thêm