Kotlin/Native — 是一个将 Kotlin 代码直接编译为原生机器码的编译器,无需虚拟机即可运行。与 JVM 版本不同,Kotlin/Native 使用 LLVM 后端为 iOS、Android NDK、macOS、Windows、Linux 和 WebAssembly 生成可执行文件。该技术是 Kotlin Multiplatform 的基础,并确保在 JVM 不可用的平台上执行共享代码。根据 JetBrains, 2025,Kotlin/Native 支持 13 个目标平台,并允许在 KMM 项目中重用高达 90% 的代码。
要点
Kotlin/Native — 是由 JetBrains 公司开发的将 Kotlin 代码编译为原生机器码的技术。与 Kotlin/JVM 的主要区别在于不需要虚拟机——最终的可执行文件只包含机器码和最小的运行时环境。这使得 Kotlin 应用程序可以在不支持 JVM 的设备和系统上运行,包括 iPhone、Apple Watch 和嵌入式系统。
Kotlin/Native 的历史始于一个实验性编译器项目,该项目于 2017 年集成到 Kotlin 主分支中。2019 年在 KotlinConf 上宣布支持 iOS 作为目标平台,这成为移动开发的转折点。从 Kotlin 1.9.20 版本开始,Kotlin/Native 编译器达到了稳定状态,并默认包含在 Kotlin Multiplatform 中。
Kotlin/Native 的关键特性是使用共享中间表示 IR,该表示为每个平台单独编译为机器码。这为所有 Kotlin 后端(JVM、JS 和 Native)提供了统一的编译前端。
编译 Kotlin/Native 经历多个转换阶段。Kotlin 源代码首先转换为内部表示,然后进行优化并传递给 LLVM 后端以生成机器码。最后阶段是与运行时库链接并创建可执行文件或动态库。
架构包括三个关键组件:前端(解析和类型检查)、IR 生成器(构建中间表示)和 LLVM 后端(生成机器码)。此方案类似于 C++ 和 Rust 的 Clang 编译器中使用的方法。
// 通过命令行编译 Kotlin/Native
kotlinc-native hello.kt -o hello -opt
// 通过 Kotlin Multiplatform 为 iOS arm64 构建
./gradlew :shared:linkDebugFrameworkIosArm64
对于内存管理,Kotlin/Native 使用自己的 Memory Manager,基于带有循环检测器的引用计数。从 Kotlin 1.7.20 开始,新的内存管理器默认工作,不需要 @ThreadLocal 或 @SharedImmutable 注释。垃圾收集器无需停止线程即可工作,这对于 iOS 至关重要,因为系统可能在主线程长时间阻塞时强制关闭应用程序。
编译过程分为五个阶段:解析(分析源代码)、语义分析(类型检查和名称解析)、IR 生成(构建中间表示)、优化(简化和删除死代码)和 代码生成(通过 LLVM)。每个阶段可以针对不同的模块并行执行,从而加快大型项目的构建速度。
| 阶段 | 持续时间 | 结果 |
|---|---|---|
| 解析 | 约 10% 时间 | 源代码的 AST 树 |
| 语义分析 | 约 20% 时间 | 类型化 AST |
| IR 生成 | 约 15% 时间 | Kotlin IR(中间表示) |
| 优化 | 约 25% 时间 | 优化后的 IR |
| LLVM 代码生成 | 约 30% 时间 | 机器码 + 可执行文件 |
Kotlin/Native 支持 13 个目标平台,分为不同的类别。对于移动开发,支持 iOS (arm64)、Android (arm32, arm64, x86_64) 和 watchOS。桌面平台包括 macOS (x64, arm64)、Windows (mingw x64) 和 Linux (x64, arm64, arm32)。对于服务器和嵌入式开发,支持 WebAssembly 和无操作系统的 LLVM 上的 Kotlin/Native(独立模式)。每个平台需要在输出端有单独的框架或库。
对于 iOS,Kotlin/Native 生成一个可以连接到 Xcode 项目的通用框架 (.framework)。对于 Android NDK,创建可以通过 JNI 调用的原生 .so 库。watchOS 平台从 Kotlin 1.6.0 开始支持,tvOS 从 1.7.0 版本开始支持。每个架构需要单独的构建,但 Kotlin Multiplatform 通过 Gradle 插件自动化此过程。
macOS 和 Linux 用于使用 Compose Multiplatform 框架在 Kotlin 中开发原生桌面应用程序。Windows (MinGW) 平台从 Kotlin 1.3.70 开始支持,允许无需安装 JVM 即可创建 Windows 应用程序。对于服务器开发,Kotlin/Native 可用于 JVM 不可用的环境,例如基于 scratch 或 Alpine 的最小镜像的 Docker 容器中。
| 类别 | 平台 | 架构 |
|---|---|---|
| 移动 | iOS | arm64,模拟器 (x64, arm64) |
| 移动 | Android NDK | arm32, arm64, x86, x86_64 |
| 可穿戴 | watchOS | arm64,模拟器 (x64) |
| 桌面 | macOS | x64, arm64 |
| 桌面 | Windows | mingw x64 |
| 桌面 | Linux | x64, arm64, arm32 |
iOS 是 KMM 背景下 Kotlin/Native 的主要目标平台。编译器创建一个包含所有共享代码的 iOS 框架,然后连接到 Xcode 项目。该框架支持静态和动态链接。Kotlin/Native 为 Kotlin 类和函数生成 Objective-C 包装器,确保与 Swift 和 Objective-C 代码的直接集成。
与 iOS 集成需要配置 Xcode 以连接生成的框架。Kotlin Multiplatform 通过从 Xcode Build Phases 运行的 embedAndSignAppleFrameworkForXcode 任务自动化此过程。对于调试,Kotlin/Native 支持在 iOS 模拟器上运行应用程序时在共享模块代码中设置断点。
// Kotlin 代码编译为 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 与 iOS 代码双向工作。Kotlin/Native 为 Kotlin 类生成 Objective-C 头文件,这些头文件自动从 Swift 可用。通过 @ObjCName 注释提供反馈,用于以指定的 Objective-C 名称导出 Kotlin 函数。Kotlin 集合自动转换为 NSArray 和 NSDictionary,Kotlin 协程通过 SKIE 库包装到 Combine publishers 中。为了从 Kotlin 与 iOS 框架一起工作,使用 cinterop——一个用于为 Objective-C 头文件生成 Kotlin 绑定的工具。
要开始使用 Kotlin/Native,需要配置 build.gradle.kts,指定 Kotlin Multiplatform 插件和目标平台。让我们来看一个支持 iOS 和 Android 的 KMM 项目的最小配置。
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")
}
}
}
配置构建后,可以添加平台相关代码。Kotlin/Native 通过 Kotlin 包装器提供对 iOS 函数的访问。例如,在 iOS 上获取设备 UUID 需要调用 Foundation 中的 NSUUID。
import platform.Foundation.NSUUID
fun getDeviceId(): String {
return NSUUID().UUIDString()
}
fun currentTimestampMillis(): Long {
return (platform.Foundation.NSDate().timeIntervalSince1970 * 1000).toLong()
}
要生成 iOS 框架,使用 Gradle 任务 linkDebugFrameworkIosArm64 或用于生产的 linkReleaseFrameworkIosArm64。构建后,框架位于 build/bin/iosArm64/debugFramework/。连接到 Xcode 项目通过 Pods Podfile 或将框架添加到 General → Frameworks, Libraries and Embedded Content 部分来完成。
// 为 iOS arm64 构建发布框架
./gradlew :shared:linkReleaseFrameworkIosArm64
// 构建通用框架 x86_64 + arm64
./gradlew :shared:linkReleaseFrameworkIosX64 \
:shared:linkReleaseFrameworkIosArm64
// 为 App Store 创建 XCFramework
./gradlew :shared:assembleReleaseXCFramework
Kotlin/Native 和 Kotlin/JVM 在架构、性能和应用领域上有所不同。Kotlin/JVM 将代码编译为在 JVM 上执行的字节码,提供了对庞大 Java 库生态系统的访问,但需要安装的虚拟机。Kotlin/Native 生成没有外部依赖的可执行文件,但库生态系统更为有限。
Kotlin/Native 的启动时间性能更高,因为不需要加载 JVM。根据 JetBrains 的基准测试,Kotlin/Native 上的 Hello World 应用程序在 0.003 秒内启动,而 Kotlin/JVM 需要 0.5–1 秒来加载虚拟机。但是,由于包含了运行时,Kotlin/Native 的可执行文件大小可能大 2–3 倍。
| 特性 | Kotlin/Native | Kotlin/JVM |
|---|---|---|
| 目标平台 | iOS、macOS、Windows、Linux、WebAssembly、嵌入式 | 服务器、Android、桌面 (JVM) |
| 依赖 | 无运行时(独立) | 需要 JVM (JDK/JRE) |
| 启动时间 | 约 3 毫秒 | 约 500–1000 毫秒 |
| 生态系统 | 有限 (Kotlin + Interop) | 完整 (Kotlin + Java + Android SDK) |
| 二进制大小 | 约 1–5 MB(含运行时) | 约 100–500 KB (JAR) |
Kotlin/Native 和 Kotlin/JVM 之间的选择取决于目标平台。如果项目面向 iOS 或需要最少资源消耗,Kotlin/Native 是唯一的选择。对于 Android 开发,Kotlin/JVM 仍然是标准,尽管 Kotlin/Native 用于需要原生性能的 NDK 组件。在多平台项目中,Kotlin Multiplatform 结合了两种方法:共享代码通过 Kotlin/Native 为 iOS 编译,通过 Kotlin/JVM 为 Android 编译。
常见问题
Kotlin/Native 将代码编译为原生机器码而不需要虚拟机,而 Kotlin/JVM 编译为需要安装 JVM 的字节码。Kotlin/Native 用于 iOS、嵌入式系统和 WebAssembly,Kotlin/JVM 用于 Android 和服务器。
可以,Kotlin/Native 可以作为独立编译器使用,为任何支持的平台创建控制台应用程序、原生插件或库。KMM 只是简化了多平台代码的组织。
Memory Manager Kotlin/Native 使用带有自动循环检测器的引用计数。从 Kotlin 1.7.20 开始,垃圾收集器不需要 @ThreadLocal 注释,并且无需停止 iOS 主线程即可工作。
通过 cinterop,所有 iOS 框架都可用:Foundation、UIKit、CoreData、CoreBluetooth、MapKit 以及数百个其他框架。JetBrains 在 Kotlin/Native 组件中为标准 iOS 库提供现成的绑定。
调试使用 Xcode 和连接的 Kotlin/Native 框架。Kotlin 代码中的断点在 iOS 模拟器上运行时有效。对于设备,需要 Debug 构建和 Apple 开发人员配置文件。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。