Kotlin/Native là trình biên dịch dịch mã Kotlin trực tiếp thành mã máy gốc, hoạt động không cần máy ảo. Không giống như phiên bản JVM, Kotlin/Native sử dụng backend LLVM để tạo tệp thực thi cho iOS, Android NDK, macOS, Windows, Linux và WebAssembly. Công nghệ này là nền tảng của Kotlin Multiplatform và cho phép thực thi mã dùng chung trên các nền tảng không có JVM. Theo JetBrains, 2025, Kotlin/Native hỗ trợ 13 nền tảng mục tiêu và cho phép tái sử dụng tới 90% mã trong các dự án KMM.
Những điểm chính
Kotlin/Native là công nghệ biên dịch mã Kotlin thành mã máy gốc, được phát triển bởi JetBrains. Sự khác biệt chính so với Kotlin/JVM là không cần máy ảo — tệp thực thi kết quả chỉ chứa mã máy và thời gian chạy tối thiểu. Điều này cho phép chạy các ứng dụng Kotlin trên các thiết bị và hệ thống không hỗ trợ JVM, bao gồm iPhone, Apple Watch và hệ thống nhúng.
Lịch sử của Kotlin/Native bắt đầu với một dự án — một trình biên dịch thử nghiệm được tích hợp vào nhánh chính của Kotlin vào năm 2017. Năm 2019, tại KotlinConf, hỗ trợ cho iOS như một nền tảng mục tiêu đã được công bố, trở thành bước ngoặt cho phát triển di động. Kể từ Kotlin 1.9.20, trình biên dịch Kotlin/Native đã đạt được sự ổn định và được bao gồm trong Kotlin Multiplatform theo mặc định.
Tính năng chính của Kotlin/Native là sử dụng biểu diễn trung gian chung IR, được biên dịch thành mã máy cho mỗi nền tảng riêng biệt. Điều này cung cấp một frontend biên dịch thống nhất cho tất cả các backend của Kotlin: JVM, JS và Native.
Biên dịch trong Kotlin/Native trải qua nhiều giai đoạn chuyển đổi. Mã nguồn Kotlin trước tiên được chuyển đổi thành biểu diễn nội bộ, sau đó được tối ưu hóa và chuyển đến backend LLVM để tạo mã máy. Giai đoạn cuối cùng là liên kết với các thư viện thời gian chạy và tạo tệp thực thi hoặc thư viện động.
Kiến trúc bao gồm ba thành phần chính: frontend (phân tích và kiểm tra kiểu), trình tạo IR (xây dựng biểu diễn trung gian) và backend LLVM (tạo mã máy). Sơ đồ này tương tự như cách tiếp cận được sử dụng trong trình biên dịch Clang cho C++ và Rust.
// Biên dịch Kotlin/Native qua dòng lệnh
kotlinc-native hello.kt -o hello -opt
// Xây dựng cho iOS arm64 qua Kotlin Multiplatform
./gradlew :shared:linkDebugFrameworkIosArm64
Để quản lý bộ nhớ, Kotlin/Native sử dụng Memory Manager riêng, dựa trên đếm tham chiếu với bộ phát hiện chu trình. Kể từ Kotlin 1.7.20, trình quản lý bộ nhớ mới hoạt động theo mặc định và không yêu cầu chú thích @ThreadLocal hoặc @SharedImmutable. Bộ thu gom rác hoạt động mà không dừng luồng, điều này rất quan trọng đối với iOS, nơi hệ thống có thể buộc kết thúc ứng dụng trong thời gian chặn kéo dài luồng chính.
Quá trình biên dịch được chia thành năm giai đoạn: phân tích cú pháp (phân tích mã nguồn), phân tích ngữ nghĩa (kiểm tra kiểu và giải quyết tên), tạo IR (xây dựng biểu diễn trung gian), tối ưu hóa (đơn giản hóa và loại bỏ mã chết) và tạo mã qua LLVM. Mỗi giai đoạn có thể được thực thi song song cho các mô-đun khác nhau, giúp tăng tốc độ xây dựng các dự án lớn.
| Giai đoạn | Thời lượng | Kết quả |
|---|---|---|
| Phân tích cú pháp | ~10% thời gian | Cây AST của mã nguồn |
| Phân tích ngữ nghĩa | ~20% thời gian | AST đã định kiểu |
| Tạo IR | ~15% thời gian | Kotlin IR (Biểu diễn trung gian) |
| Tối ưu hóa | ~25% thời gian | IR đã tối ưu hóa |
| Tạo mã LLVM | ~30% thời gian | Mã máy + tệp thực thi |
Kotlin/Native hỗ trợ 13 nền tảng mục tiêu, được chia thành các danh mục. Cho phát triển di động, iOS (arm64), Android (arm32, arm64, x86_64) và watchOS có sẵn. Các nền tảng máy tính để bàn bao gồm macOS (x64, arm64), Windows (mingw x64) và Linux (x64, arm64, arm32). Cho phát triển máy chủ và nhúng, WebAssembly và Kotlin/Native trên LLVM không có hệ điều hành (standalone) có sẵn. Mỗi nền tảng yêu cầu một framework hoặc thư viện riêng biệt làm đầu ra.
Đối với iOS, Kotlin/Native tạo một framework phổ quát (.framework) có thể được kết nối với dự án Xcode. Đối với Android NDK, các thư viện gốc .so được tạo ra có thể gọi qua JNI. watchOS được hỗ trợ từ Kotlin 1.6.0 và tvOS từ phiên bản 1.7.0. Mỗi kiến trúc yêu cầu một bản dựng riêng, nhưng Kotlin Multiplatform tự động hóa quy trình này thông qua plugin Gradle.
macOS và Linux được sử dụng để phát triển ứng dụng máy tính để bàn gốc bằng Kotlin với framework Compose Multiplatform. Windows (MinGW) được hỗ trợ từ Kotlin 1.3.70 và cho phép tạo ứng dụng Windows mà không cần cài đặt JVM. Cho phát triển máy chủ, Kotlin/Native có thể được sử dụng trong môi trường không có JVM, như container Docker với hình ảnh tối thiểu dựa trên scratch hoặc Alpine.
| Danh mục | Nền tảng | Kiến trúc |
|---|---|---|
| Di động | iOS | arm64, trình mô phỏng (x64, arm64) |
| Di động | Android NDK | arm32, arm64, x86, x86_64 |
| Đeo được | watchOS | arm64, trình mô phỏng (x64) |
| Máy tính để bàn | macOS | x64, arm64 |
| Máy tính để bàn | Windows | mingw x64 |
| Máy tính để bàn | Linux | x64, arm64, arm32 |
iOS là nền tảng mục tiêu chính của Kotlin/Native trong bối cảnh KMM. Trình biên dịch tạo một framework iOS chứa tất cả mã dùng chung, sau đó được kết nối với dự án Xcode. Framework hỗ trợ cả liên kết tĩnh và động. Kotlin/Native tạo các wrapper Objective-C cho các lớp và hàm Kotlin, cung cấp tích hợp trực tiếp với mã Swift và Objective-C.
Tích hợp với iOS yêu cầu cấu hình Xcode để kết nối framework đã tạo. Kotlin Multiplatform tự động hóa quy trình này bằng tác vụ embedAndSignAppleFrameworkForXcode, được gọi từ Xcode Build Phases. Để gỡ lỗi, Kotlin/Native hỗ trợ các điểm dừng trong mã mô-đun dùng chung khi chạy ứng dụng trên trình mô phỏng iOS.
// Mã Kotlin được biên dịch thành framework iOS
package com.itsectr.shared
class GreetingProvider {
fun createGreeting(): String {
return "Hello from Kotlin/Native!"
}
fun formatVersion(major: Int, minor: Int): String {
return "v$major.$minor"
}
}
Interop với mã iOS hoạt động theo cả hai hướng. Kotlin/Native tạo các tiêu đề Objective-C cho các lớp Kotlin, tự động có thể truy cập từ Swift. Giao tiếp ngược được cung cấp bằng chú thích @ObjCName để xuất các hàm Kotlin dưới tên Objective-C được chỉ định. Bộ sưu tập Kotlin tự động được chuyển đổi thành NSArray và NSDictionary, và coroutine Kotlin được bọc trong các publisher Combine qua thư viện SKIE. Để làm việc với các framework iOS từ Kotlin, cinterop được sử dụng — một công cụ tạo ràng buộc Kotlin cho các tiêu đề Objective-C.
Để bắt đầu với Kotlin/Native, cần cấu hình build.gradle.kts với plugin Kotlin Multiplatform và các nền tảng mục tiêu. Hãy xem cấu hình tối thiểu cho dự án KMM hỗ trợ iOS và Android.
plugins {
kotlin("multiplatform") version "2.0.21"
}
kotlin {
iosArm64()
iosSimulatorArm64()
sourceSets {
commonMain.dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
}
iosMain.dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
}
}
}
Sau khi thiết lập bản dựng, có thể thêm mã dành riêng cho nền tảng. Kotlin/Native cung cấp quyền truy cập vào các hàm iOS thông qua wrapper Kotlin. Ví dụ: lấy UUID thiết bị trên iOS yêu cầu gọi NSUUID từ Foundation.
import platform.Foundation.NSUUID
fun getDeviceId(): String {
return NSUUID().UUIDString()
}
fun currentTimestampMillis(): Long {
return (platform.Foundation.NSDate().timeIntervalSince1970 * 1000).toLong()
}
Để tạo framework iOS, tác vụ Gradle linkDebugFrameworkIosArm64 hoặc linkReleaseFrameworkIosArm64 cho sản xuất được sử dụng. Sau khi xây dựng, framework nằm trong build/bin/iosArm64/debugFramework/. Kết nối với dự án Xcode được thực hiện qua Pods Podfile hoặc thêm framework vào General → Frameworks, Libraries and Embedded Content.
// Xây dựng framework release cho iOS arm64
./gradlew :shared:linkReleaseFrameworkIosArm64
// Xây dựng framework phổ quát x86_64 + arm64
./gradlew :shared:linkReleaseFrameworkIosX64 \
:shared:linkReleaseFrameworkIosArm64
// Tạo XCFramework cho App Store
./gradlew :shared:assembleReleaseXCFramework
Kotlin/Native và Kotlin/JVM khác nhau về kiến trúc, hiệu suất và phạm vi ứng dụng. Kotlin/JVM biên dịch mã thành bytecode chạy trên JVM, cung cấp quyền truy cập vào hệ sinh thái thư viện Java rộng lớn, nhưng yêu cầu máy ảo đã cài đặt. Kotlin/Native tạo tệp thực thi không có phụ thuộc bên ngoài, nhưng với hệ sinh thái thư viện hạn chế hơn.
Hiệu suất thời gian khởi động cao hơn ở Kotlin/Native vì không cần tải JVM. Theo điểm chuẩn của JetBrains, ứng dụng Hello World trên Kotlin/Native khởi động trong 0,003 giây, trong khi Kotlin/JVM cần 0,5–1 giây để tải máy ảo. Tuy nhiên, kích thước tệp thực thi của Kotlin/Native có thể lớn hơn 2–3 lần do thời gian chạy được bao gồm.
| Đặc điểm | Kotlin/Native | Kotlin/JVM |
|---|---|---|
| Nền tảng mục tiêu | iOS, macOS, Windows, Linux, WebAssembly, nhúng | Máy chủ, Android, máy tính để bàn (JVM) |
| Phụ thuộc | Không có thời gian chạy (tự chứa) | Yêu cầu JVM (JDK/JRE) |
| Thời gian khởi động | ~3 ms | ~500–1000 ms |
| Hệ sinh thái | Hạn chế (Kotlin + Interop) | Đầy đủ (Kotlin + Java + Android SDK) |
| Kích thước tệp nhị phân | ~1–5 MB (có thời gian chạy) | ~100–500 KB (JAR) |
Sự lựa chọn giữa Kotlin/Native và Kotlin/JVM phụ thuộc vào nền tảng mục tiêu. Nếu dự án nhắm đến iOS hoặc yêu cầu tiêu thụ tài nguyên tối thiểu, Kotlin/Native là lựa chọn duy nhất. Đối với phát triển Android, Kotlin/JVM vẫn là tiêu chuẩn, mặc dù Kotlin/Native được sử dụng cho các thành phần NDK nơi cần hiệu suất gốc. Trong các dự án đa nền tảng, Kotlin Multiplatform kết hợp cả hai cách tiếp cận: mã dùng chung được biên dịch qua Kotlin/Native cho iOS và qua Kotlin/JVM cho Android.
Câu hỏi thường gặp
Kotlin/Native biên dịch mã thành mã máy gốc không cần máy ảo, trong khi Kotlin/JVM biên dịch thành bytecode yêu cầu JVM đã cài đặt. Kotlin/Native được sử dụng cho iOS, hệ thống nhúng và WebAssembly, còn Kotlin/JVM được sử dụng cho Android và máy chủ.
Có, Kotlin/Native có thể được sử dụng như một trình biên dịch độc lập để tạo ứng dụng console, plugin gốc hoặc thư viện cho bất kỳ nền tảng được hỗ trợ nào. KMM chỉ đơn giản hóa việc tổ chức mã đa nền tảng.
Memory Manager của Kotlin/Native sử dụng đếm tham chiếu với bộ phát hiện chu trình tự động. Kể từ Kotlin 1.7.20, bộ thu gom rác không yêu cầu chú thích @ThreadLocal và hoạt động mà không dừng luồng chính iOS.
Thông qua cinterop, tất cả các framework iOS đều có thể truy cập: Foundation, UIKit, CoreData, CoreBluetooth, MapKit và hàng trăm framework khác. JetBrains cung cấp các ràng buộc có sẵn cho các thư viện iOS tiêu chuẩn như một phần của Kotlin/Native.
Việc gỡ lỗi được thực hiện bằng Xcode với framework Kotlin/Native được kết nối. Các điểm dừng trong mã Kotlin hoạt động khi chạy trên trình mô phỏng iOS. Đối với thiết bị thật, cần có bản dựng Debug và hồ sơ nhà phát triển Apple.
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