本篇只介绍概念原理,后面还会有实践篇带大家看具体的代码实现细节。
KMP 即 Kotlin Multiplatform,是一种跨平台开发方案。在不同平台上,KMP 使用不同的 Kotlin 技术:
- Android: Kotlin/JVM
- iOS: Kotlin/Native
- 鸿蒙: Kotlin/JS
- Desktop: Kotlin/JVM
- Web: Kotlin/Wasm,Kotlin/JS
对于鸿蒙开发,KMP 主要有 Kotlin/JS 和 Kotlin/Native 两种路线。众多大厂(如 B 站、腾讯、快手等)都选择了比较难的 Kotlin/Native 路线,大部分只通过 KMP 多端复用 Java 业务逻辑代码,至于使用 Compose UI 开发鸿蒙界面有一些实践但不多。腾讯视频通过 KMP + Compose UI 实现了真正的三端一码(Android、iOS、鸿蒙 Next)。
有意思的是,Jetpack 官方架构师不是很看好 Kotlin/Native 开发鸿蒙,因为 Kotlin/Native 路线多了一套额外的运行时。未来 Jetpack KMP 可能会原生支持 Kotlin 编译为 ArkTS 代码。
Kotlin/JS 路线由于鸿蒙 ArkTS 原生就支持运行 JS 代码,所以天生支持鸿蒙开发。但 Kotlin/JS 只针对 Node 和 Browser 平台进行编译,而 ArkTS 并不是纯 JS,很多 npm 包在鸿蒙里可能无法运行,问题往往到运行时才能暴露。此外,Kotlin 协程在 JS 中运行在单线程上,对于 CPU 密集型任务会有瓶颈。
Kotlin/Native 路线则非常困难。官方现在并不支持鸿蒙平台 Native 代码的编译,需要自己去移植改写 Kotlin/Native 编译器来适配鸿蒙平台,工作量很大,需要对系统底层比较熟悉。而且所有现有的 KMP 三方包都需要针对鸿蒙平台重新编译。此外,还需要通过 NAPI 接口绑定来暴露给 ArkTS 调用,过程繁琐。
Kotlin/Wasm 路线比较小众,有些公司移植了 Wasm 虚拟机到鸿蒙平台来跑 Wasm 代码。Wasm 的好处是可以运行在浏览器里,KMP 就是通过 Kotlin/Wasm 来支持 Web 开发的,而且可以扩展到微信小程序等环境。
Compose UI 的跨端目前主要有两种技术方案:一是通过 Kotlin/Native 移植 Skiko 来实现自渲染 UI(类似 Flutter 方案);二是通过类 RN 方案来把 Compose UI 翻译成鸿蒙的 ArkUI。真正的三端一码,即 UI 和逻辑全部共用,还有很长的路要走,期待 KMP 的官方支持。
业内团队在路线选择上进行了深入考量。Kotlin/JS 路线成本低、上手快,但存在一些运行时兼容性和性能问题。Kotlin/Native 路线难度高,只有大公司才能承担,预计 2025 年会逐步有开源解决方案出现。
最后建议:Kotlin/JS 路线是 Kotlin 开发鸿蒙最快成本最低的方案,中小公司和个人优先选择 Kotlin/JS。Kotlin/Native 路线可以等待开源成熟后再采用。在 UI 层面,最推荐使用 Swift UI、ArkUI 等原生 UI 框架来写界面,只用 KMP 来复用业务逻辑代码,这应该是效率最高(运行效率和开发效率)的实践。三端一码很诱人,但坑也很多。如果想跨小程序,Kotlin/Wasm 最简单。