Kotlin/Native 适配鸿蒙的一些梳理

目录
最近在 Kotlin/Native 上适配鸿蒙,坑不少;而且 K/N 相当于用 Kotlin 写 C/C++,一出内存问题就挠头。另外 K/N 和 iOS / Xcode、LLVM 绑得比较紧,编译时各种版本兼容问题(比如 Kotlin 1.9.x 和 Xcode 16 不兼容)。
最终是在 K/N 里把官方 LLVM 11 换成 LLVM 12 做了鸿蒙适配,但还没经过线上验证(KSP 生成鸿蒙 NAPI 胶水又是另一件头疼事);目前倾向和官方保持一致用 LLVM 11,鸿蒙单独用 LLVM 12,所以还要做隔离。下面是一些理解,不一定完全准确。
一、Kotlin 2.0.21 适配 OHOS 的通用问题
1.1 LLVM 版本
- 到 Kotlin 2.1.0 之前,K/N 用的都是 LLVM 11.1.0。
- 鸿蒙(后文简称 OHOS)3.2.x 用 LLVM 12.0.1,5.x 用 15.0.4。
试过在 Kotlin 2.0.21 上指到 OHOS 15.0.4 的 LLVM,报错很多,差异太大,就退回 3.2.x。在 3.2.x 用 OHOS 自带的 clang 时遇到 LLVM bitcode 版本不匹配(听说淘宝、快手没遇到)。于是把 K/N 工程升到 LLVM 12.0.1,社区版 LLVM/Clang 又有编译问题,最后自己编了一份 Apple LLVM 12.0.0 才过。
1.2 编译 LLVM 本身
Kotlin 2.0.21 不能直接用上游 LLVM,因为 K/N 对 LLVM 有修改、去掉了一些 hardcode,需要把相关 patch cherry-pick 过来再编一份。
1.3 KT-69094
https://youtrack.jetbrains.com/issue/KT-69094
官方自己兜了底:bundle / publish 或编译 Apple 系 x86 时,需要加参数:
-Pkonan.xcodeForSimdOverlay=/path/to/xcode15
二、编译器与编译流程
2.1 编译器本身编译

2.2 编译 kt 文件
有两条路径,但最终都会走到 CLI runner:

2.3 隔离 LLVM 时遇到的问题
