Skip to content

Kotlin/Native 概览

源:Kotlin/Native

Kotlin/Native 是一项将 Kotlin 代码直接编译为原生二进制文件的技术,使其无需虚拟机即可在多种平台上运行。这项技术是 Kotlin Multiplatform 生态的核心组成部分,专注于需要直接访问底层硬件或系统 API 的场景。

什么是 Kotlin/Native

Kotlin/Native 使用基于 LLVM 的编译器后端,将 Kotlin 代码编译为独立的原生可执行文件。这意味着:

  • 无需虚拟机:编译后的程序直接在目标平台的硬件上运行
  • 完整的原生性能:没有 JVM 或其他运行时的额外开销
  • 小巧的二进制文件:仅包含实际使用的代码和依赖
  • 直接系统访问:可以调用操作系统的原生 API
kotlin
// Kotlin/Native 代码会被直接编译为平台原生二进制
fun main() {
    println("Hello, Native World!")
    // 这段代码在 Linux 上编译成 ELF,在 macOS 上编译成 Mach-O
}

支持的目标平台

Kotlin/Native 支持广泛的目标平台:

Apple 生态

  • iOS: ARM64 设备、x64 和 ARM64 模拟器
  • macOS: x64 和 ARM64 (Apple Silicon)
  • watchOS: ARM64 设备、x64 和 ARM64 模拟器
  • tvOS: ARM64 设备、x64 和 ARM64 模拟器

桌面平台

  • Linux: x64、ARM64
  • Windows: x64 (使用 MinGW)
  • macOS: x64、ARM64

移动平台

  • Android NDK: ARM32、ARM64、x86、x64

嵌入式系统

  • Raspberry Pi
  • STM32 (实验性)

核心特性

与 C/C++ 互操作

Kotlin/Native 提供了强大的 C 互操作能力,可以直接使用现有的 C 库:

kotlin
// 使用 POSIX API
import kotlinx.cinterop.*
import platform.posix.*

fun listFiles(path: String) {
    val dir = opendir(path) ?: return
    try {
        while (true) {
            val entry = readdir(dir) ?: break
            val name = entry.pointed.d_name.toKString()
            println(name)
        }
    } finally {
        closedir(dir)
    }
}

与 Objective-C/Swift 互操作

iOS 开发中可以无缝调用 Objective-C 和 Swift 框架:

kotlin
// iosMain/kotlin
import platform.UIKit.*
import platform.Foundation.*

fun getDeviceInfo(): String {
    val device = UIDevice.currentDevice
    return "Device: ${device.name}, iOS: ${device.systemVersion}"
}

自动内存管理

Kotlin/Native 采用现代内存管理器,兼容各平台的内存模型:

  • 自动垃圾回收:使用基于跟踪的 GC
  • 与 ARC 集成:iOS 平台与 Objective-C 的 ARC 无缝协作
  • 并发安全:新内存管理器支持多线程共享对象
kotlin
class DataProcessor {
    private val cache = mutableListOf<ByteArray>()
    
    fun process(data: ByteArray) {
        cache.add(data)
        // 无需手动释放,GC 自动管理
    }
}

使用场景

跨平台业务逻辑共享

在 Android 和 iOS 之间共享核心逻辑:

kotlin
// shared/src/commonMain/kotlin
class UserRepository {
    suspend fun getUser(id: String): User {
        // 网络请求、数据处理等业务逻辑
        return User(id, "Alice")
    }
}
kotlin
// shared/src/androidMain/kotlin
actual fun createHttpClient(): HttpClient {
    // Android 特定实现
}
kotlin
// shared/src/iosMain/kotlin
actual fun createHttpClient(): HttpClient {
    // iOS 特定实现
}

高性能原生库开发

开发需要直接硬件访问的库:

kotlin
// 图像处理库
class ImageProcessor {
    fun applyFilter(bitmap: CPointer<ByteVar>, width: Int, height: Int) {
        // 直接操作像素数据,无 JVM 开销
        for (i in 0 until width * height) {
            bitmap[i] = (bitmap[i].toInt() * 0.8).toByte()
        }
    }
}

嵌入式系统开发

为资源受限的设备编写代码:

kotlin
fun main() {
    // 在嵌入式设备上运行,无需 JVM
    initializeHardware()
    mainLoop()
}

Android JNI 替代方案

用 Kotlin 编写 JNI 代码,替代传统 C/C++:

kotlin
// 用 Kotlin 写 JNI,替代 C++
@CName("Java_com_example_NativeLib_processData")
fun processData(env: CPointer<JNIEnvVar>, thiz: jobject, data: jbyteArray): jint {
    // 类型安全、自动内存管理的 JNI 代码
    return 42
}

编译器架构

LLVM 后端

Kotlin/Native 使用 LLVM 工具链进行代码生成:

Kotlin 源码 → Kotlin IR → LLVM IR → 原生机器码

这意味着:

  • 享受 LLVM 的优化能力
  • 支持所有 LLVM 目标平台
  • 可以与其他 LLVM 语言互操作(如 Rust、Swift)

konan 编译器

Kotlin/Native 编译器(konan)是 Kotlin 编译器的原生版本:

bash
# 编译为 Linux x64 二进制
kotlinc-native main.kt -o myapp

# 编译为 iOS Framework
./gradlew :shared:linkDebugFrameworkIosArm64

构建系统集成

Gradle 插件

使用 Kotlin Multiplatform Gradle 插件配置目标平台:

kotlin
// build.gradle.kts
kotlin {
    // iOS 目标
    iosX64()
    iosArm64()
    iosSimulatorArm64()
    
    // Android Native (JNI)
    androidNativeArm64()
    androidNativeX64()
    
    // 桌面目标
    linuxX64()
    macosX64()
    macosArm64()
    mingwX64()
    
    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
            }
        }
        
        val nativeMain by creating {
            dependsOn(commonMain)
        }
        
        val iosMain by creating {
            dependsOn(nativeMain)
        }
    }
}

Framework 生成

为 iOS 生成可复用的框架:

kotlin
kotlin {
    listOf(iosX64(), iosArm64(), iosSimulatorArm64()).forEach { target ->
        target.binaries.framework {
            baseName = "SharedSDK"
            isStatic = true
            
            // 优化选项
            freeCompilerArgs += listOf(
                "-Xobjc-generics",  // 启用泛型支持
                "-Xg0"               // 调试信息
            )
        }
    }
}

与 KMP 的关系

Kotlin/Native 是 Kotlin Multiplatform (KMP) 的一部分:

概念说明
Kotlin Multiplatform跨平台应用开发框架(包含 JVM、JS、Native)
Kotlin/NativeNative 目标平台的编译器后端
Kotlin Multiplatform
├── JVM 目标 (Android, Desktop)
├── JS 目标 (Web, Node.js)
└── Native 目标 ← Kotlin/Native 负责这部分
    ├── iOS
    ├── macOS
    ├── Linux
    └── Windows

在 KMP 项目中,Kotlin/Native 负责编译 iosMainmacosMain 等 Native 源集的代码。

性能特点

启动速度

相比 JVM 应用,原生应用启动更快:

  • 无 JVM 预热:代码已经是机器码
  • 更小的内存占用:无需加载整个运行时
  • 更快的首帧渲染:iOS 上比 Flutter/React Native 更快

运行时性能

在某些场景下,Kotlin/Native 性能与 C/C++ 相当:

  • 数学密集型计算
  • 图像/音视频处理
  • 系统调用密集场景

WARNING

需要注意的是,Kotlin/Native 的 GC 在某些场景下会有性能开销。对于极致性能需求,仍需要手动内存管理或混合 C/C++。

生态系统

官方库支持

大部分 Kotlin 官方库都支持 Native 目标:

kotlin
dependencies {
    // 协程
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
    
    // 序列化
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3")
    
    // 日期时间
    implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.5.0")
    
    // IO
    implementation("org.jetbrains.kotlinx:kotlinx-io-core:0.3.1")
}

社区生态

流行的跨平台库也支持 Kotlin/Native:

  • Ktor Client: 网络请求
  • SQLDelight: 数据库
  • Koin: 依赖注入
  • Napier: 日志
  • Coil/Kamel: 图片加载

开发工具

IDE 支持

  • IntelliJ IDEA: 完整支持,包括代码补全、调试
  • Android Studio: 通过 KMP 插件支持
  • AppCode: iOS 开发(已停止维护)
  • Xcode: 可调试编译后的 Framework

调试能力

支持原生调试流程:

kotlin
// 在 Xcode 中可以直接调试 Kotlin 代码
fun processUser(user: User) {
    println("Processing: ${user.name}") // 可以设置断点
    val result = complexCalculation(user)
    return result
}

构建选项

kotlin
kotlin {
    targets.withType<KotlinNativeTarget> {
        binaries.all {
            // 编译优化
            freeCompilerArgs += listOf(
                "-opt",                    // 启用优化
                "-Xallocator=mimalloc",    // 使用高性能分配器
                "-Xruntime-logs=gc=info"   // GC 日志
            )
        }
    }
}

学习路径建议

如果你是 Kotlin 开发者想深入 Native 开发,建议按以下路径学习:

  1. 理解编译器工具链 → 了解 konan、LLVM、klib
  2. 掌握 C 互操作 → cinterop、类型映射、指针操作
  3. 学习内存管理 → 新内存管理器、手动管理、与 C 的内存交互
  4. 实践 JNI 开发 → 用 Kotlin 写 JNI,替代 C++
  5. 深入平台特性 → Objective-C Runtime、POSIX、系统调用
  6. 性能优化 → LLVM 优化、SIMD、链接器配置

Kotlin/Native 让 Kotlin 从 JVM 世界走向了系统编程领域,为开发者提供了在保持 Kotlin 语言优势的同时,获得原生性能和平台访问能力的途径。