66、Kotlin/Native:Kotlin/Native概述、iOS开发、跨平台共享代码

说实话,Kotlin/Native 这个概念,我第一次接触时也懵了一下。那时候我还在做纯 Android 开发,突然听说 Kotlin 能直接编译成 iOS 的二进制文件,第一反应是——这玩意儿靠谱吗?

后来我在一个跨平台项目中真正用上了它。嗯,体验比想象中好不少。今天我就把这块内容掰开揉碎,跟你聊聊。

什么是 Kotlin/Native?

Kotlin/Native 是 JetBrains 推出的一种技术。它能把 Kotlin 代码直接编译成原生二进制文件,不需要 JVM 虚拟机。

说白了,就是你的 Kotlin 代码可以跑在 iOS、Windows、Linux 甚至嵌入式设备上。你想想看,这意味着一套业务逻辑,可以在多个平台复用。

核心能力:Kotlin/Native 通过 LLVM 后端,将 Kotlin 编译为目标平台的原生机器码。它不依赖 JVM,也不依赖任何运行时环境。

我在项目中遇到过最典型的场景:Android 和 iOS 共用一套数据模型和网络请求逻辑。以前得写两遍,现在只用写一次。

Kotlin/Native 的工作原理

要理解 Kotlin/Native,你得先知道它怎么工作的。我画了一张图,帮你理清思路。

Kotlin 源码 Kotlin/Native 编译器(LLVM 后端) iOS .framework / .dylib Android .so / .aar iOS App Android App

你看,流程其实很清晰。Kotlin 源码经过编译器处理,直接生成各平台的原生库。iOS 那边是 .framework,Android 这边是 .so 或 .aar。

iOS 开发:Kotlin/Native 怎么用?

我刚开始用 Kotlin/Native 做 iOS 开发时,最头疼的是怎么把 Kotlin 代码集成到 Xcode 项目里。后来发现,其实 JetBrains 已经帮我们铺好路了。

基本步骤

  1. 创建 Kotlin/Native 项目:用 IntelliJ IDEA 或 Android Studio 新建一个 Kotlin/Native 项目。
  2. 编写共享代码:把业务逻辑写在 commonMain 模块里。
  3. 编译成 iOS Framework:运行 Gradle 任务,生成 .framework 文件。
  4. 导入 Xcode:把生成的 framework 拖进 Xcode 项目,直接调用。

小技巧:我个人习惯用 Gradle 的 embedAndSignAppleFrameworkForXcode 任务。它会自动处理签名和嵌入,省去很多手动操作。

代码示例

下面是一个简单的共享代码示例。它定义了一个数据模型和一个计算函数。

// commonMain 中的共享代码
data class User(
    val id: Int,
    val name: String,
    val age: Int
)

fun calculateUserScore(user: User): Double {
    // 一些业务逻辑
    return user.age * 1.5 + user.id * 0.5
}

在 iOS 端,你可以直接用 Swift 调用它:

// iOS 端调用 Kotlin 代码
import SharedCode

let user = User(id: 1, name: "张三", age: 25)
let score = SharedCodeKt.calculateUserScore(user: user)
print("用户得分:\(score)")

你看,调用方式跟调用 Swift 原生代码几乎一样。Kotlin/Native 会自动处理好类型映射。

跨平台共享代码:核心策略

跨平台共享代码,说白了就是「写一次,到处用」。但这里有个坑——不是所有代码都能共享。

我曾经在一个项目里,试图把 UI 层也共享了。结果折腾了两周,发现 iOS 和 Android 的 UI 差异太大,强行共享反而让代码变得臃肿。后来我学乖了。

共享什么?不共享什么?

共享层 推荐共享 不推荐共享
数据模型 ✅ 实体类、DTO、枚举 ❌ 平台特有序列化格式
业务逻辑 ✅ 计算、校验、状态管理 ❌ 平台 API 调用
网络请求 ✅ 接口定义、请求封装 ❌ 底层网络库实现
数据存储 ✅ 仓库模式接口 ❌ 具体数据库实现
UI 层 ❌ 不推荐共享 ❌ 平台 UI 差异太大

注意:我曾经踩过一个坑——在共享代码里直接使用了 java.io.File。结果 iOS 编译直接报错。记住,共享代码只能使用 Kotlin/Native 支持的库,不能依赖 JVM 特有的 API。

实际项目中的架构设计

我建议你采用分层架构。这样既能最大化共享,又能保持各平台的灵活性。

共享层(commonMain) 数据模型 · 业务逻辑 · 网络接口 · 仓库模式 平台适配层(iosMain / androidMain) 平台 API 调用 · 具体实现 iOS UI(SwiftUI / UIKit) Android UI(Jetpack Compose)

这个架构的好处是:共享层只放纯逻辑,平台适配层处理具体实现,UI 层各玩各的。互不干扰,又能复用核心代码。

避坑指南

做 Kotlin/Native 跨平台开发,有几个坑我帮你提前标记一下。

  • 内存管理:Kotlin/Native 使用自动引用计数(ARC),跟 Swift 类似。但要注意循环引用问题,我遇到过因为闭包捕获导致的内存泄漏。
  • 线程模型:Kotlin/Native 的协程默认在主线程运行。如果你要在后台线程执行任务,记得用 Dispatchers.DefaultDispatchers.IO
  • 类型映射:Kotlin 的 List 在 iOS 端会变成 NSArrayMap 变成 NSDictionary。大部分情况没问题,但遇到泛型嵌套时要小心。
  • 调试困难:Kotlin/Native 的调试体验不如 JVM 版本。我建议你在共享代码里多写单元测试,提前暴露问题。

核心总结:Kotlin/Native 不是银弹,但它确实能帮你节省大量重复劳动。我的经验是——共享业务逻辑,保留平台特色。这样既高效,又不会牺牲用户体验。

嗯,关于 Kotlin/Native 的概述、iOS 开发和跨平台共享代码,今天就聊到这里。你可以在实际项目中试试看,从一个小模块开始,慢慢感受它的威力。


公众号:蓝海资料掘金营,微信deep3321