Open Gaubee opened 2 months ago
这里的讨论需要先确定对鸿蒙开发有一定的了解,才能展开有效的讨论,因此建议先阅读学习资料
从时间上:当下 jetbrains 的 roadmap 已经定下来,那就意味着至少到 25 年 Q1 之前,官方是不会有任何动作的。即便是 25H1 开始有支持的计划,那其实也够呛,按照以往的经验,alpha 至少半年,beta 至少一年……更何况,这是理想状况下了。
从技术上:其实很难真正实现对 ArkUI 的互操作性的支持。
从社区的角度,要想做到让鸿蒙真正的支持 cmp,无非就是给出一套和 Compose Web 一样的方案。
Jetbrains 是从两个方向来支持 web 的,一个是将 Compose 基于 Skia-WASM 绘制在 html-canvas 中;同时提供 Compose HTML 这套技术方案。
因此基于 Jetbrains 团队的历史决策惯性来说,大概率也是趋同于 Web:
目前 HarmonyOS 官方的 XComponent 的 NativeWindow 已经明确有对 OpenGL ES (demo)的支持,对 Vulkan(demo)的支持也有,但好像没 OpenGL ES 那么完善。因此二者都可以作为 Skia 的 Backend。 这方面理论上可以走完全的 Native,性能应该不低,特别是华为官方的Graphics Accelerate Kit有内置的插帧技术,所以流畅性应该也不是问题。
这方面不确定会用 ArkTS/JS 还是 仓颉 作为 Backend。二者对于 UI 的开发的支持都走 DSL(官方的名字是 ArkUI DSL 与 eDSL)的方案。 二者最终都会走方舟编译器编译成二进制,特别是 ArkTS,本质上根本就不是 JS+JSRuntime,而是编译成了方舟字节码+方舟运行时。 现在 ArkTS 还加入了多线程的支持: @Concurrent 修饰器,这已经是将 ArkTS 作为一门独立的语言来发展了。 官方自己的说法是会将 ArkTS 直接编译成更加高效的字节码(而不是先到 js 再到字节码),我不知道他们现在是否完整实现了? 因此如果想让 kotlin 足够快地运行再 harmonyos 设备上,就不该走方舟运行时,在方舟运行时里运行 kotlin 标准库的运行时,正如 kotlin 输出的 js 一样,臃肿缓慢,只是做到了能用,性能还不如 kotlin/wasm。 再换种思路,如果让 Kotlin 提供一种全新的 target: ArkTS,它也许会有比 kotlin/js 更好的性能,但根本问题还是摆在那里:需要跑在方舟编译器上,包括 kotlin 的 stdlib…… 再说仓颉,仓颉综合来说与 Swift 很像,但正如官方不会把 kotlin 编译成 swift 一样,这样底层库的开发成本太高了,特别是并发、多线程相关的开发与维护。 综上,我有理由下结论:Jetbrians 不会把 “支持了 JS/TS 就是支持了 HarmonyOS” 作为一个目标。
这方面不确定会用 ArkTS/JS 还是 仓颉 作为 Backend。二者对于 UI 的开发的支持都走 DSL(官方的名字是 ArkUI DSL 与 eDSL)的方案。
二者最终都会走方舟编译器编译成二进制,特别是 ArkTS,本质上根本就不是 JS+JSRuntime,而是编译成了方舟字节码+方舟运行时。
现在 ArkTS 还加入了多线程的支持: @Concurrent 修饰器,这已经是将 ArkTS 作为一门独立的语言来发展了。
官方自己的说法是会将 ArkTS 直接编译成更加高效的字节码(而不是先到 js 再到字节码),我不知道他们现在是否完整实现了? 因此如果想让 kotlin 足够快地运行再 harmonyos 设备上,就不该走方舟运行时,在方舟运行时里运行 kotlin 标准库的运行时,正如 kotlin 输出的 js 一样,臃肿缓慢,只是做到了能用,性能还不如 kotlin/wasm。
再换种思路,如果让 Kotlin 提供一种全新的 target: ArkTS,它也许会有比 kotlin/js 更好的性能,但根本问题还是摆在那里:需要跑在方舟编译器上,包括 kotlin 的 stdlib……
再说仓颉,仓颉综合来说与 Swift 很像,但正如官方不会把 kotlin 编译成 swift 一样,这样底层库的开发成本太高了,特别是并发、多线程相关的开发与维护。
综上,我有理由下结论:Jetbrians 不会把 “支持了 JS/TS 就是支持了 HarmonyOS” 作为一个目标。
OH_
综合以上的讨论,可以发现不论是 kotlin/js 还是 kotlin/native,都不是好的选择。 可以说如果 Kotlin 想要做好对 HarmonyOS 的支持,所要付出的成本是非常高的,这已经与 Kotlin 的发展策略有冲突了,不是本文能预测的范围内。 我只能得出结论说 CMP 短期内别想支持 HarmonyOS;而把 Kotlin Native 作为一个原生开发的接口库还算有可能,拿来做 UI 开发就别想了。
所以感觉还是 DUI + Kotlin Native 感觉更理想一点,可以发挥各个平台原生UI的优势 :see_no_evil: 原生鸿蒙 10月8号 公测了
参阅资料:
综合分析
从时间上:当下 jetbrains 的 roadmap 已经定下来,那就意味着至少到 25 年 Q1 之前,官方是不会有任何动作的。即便是 25H1 开始有支持的计划,那其实也够呛,按照以往的经验,alpha 至少半年,beta 至少一年……更何况,这是理想状况下了。
从技术上:其实很难真正实现对 ArkUI 的互操作性的支持。
从社区的角度,要想做到让鸿蒙真正的支持 cmp,无非就是给出一套和 Compose Web 一样的方案。
Jetbrains 是从两个方向来支持 web 的,一个是将 Compose 基于 Skia-WASM 绘制在 html-canvas 中;同时提供 Compose HTML 这套技术方案。
因此基于 Jetbrains 团队的历史决策惯性来说,大概率也是趋同于 Web:
OH_
开头的接口,都需要映射到 Kotlin 的开发中来。综合以上的讨论,可以发现不论是 kotlin/js 还是 kotlin/native,都不是好的选择。 可以说如果 Kotlin 想要做好对 HarmonyOS 的支持,所要付出的成本是非常高的,这已经与 Kotlin 的发展策略有冲突了,不是本文能预测的范围内。 我只能得出结论说 CMP 短期内别想支持 HarmonyOS;而把 Kotlin Native 作为一个原生开发的接口库还算有可能,拿来做 UI 开发就别想了。