Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【调研与讨论】关于 HarmonyOS 的支持 #226

Open
Gaubee opened this issue Sep 28, 2024 · 2 comments
Open

【调研与讨论】关于 HarmonyOS 的支持 #226

Gaubee opened this issue Sep 28, 2024 · 2 comments

Comments

@Gaubee
Copy link
Contributor

Gaubee commented Sep 28, 2024

参阅资料:

这里的讨论需要先确定对鸿蒙开发有一定的了解,才能展开有效的讨论,因此建议先阅读学习资料

  1. 鸿蒙生态应用开发白皮书 2.0
  2. HarmonyOS 开发者技术 > 浅析 eTS 的起源和演进

综合分析

从时间上:当下 jetbrains 的 roadmap 已经定下来,那就意味着至少到 25 年 Q1 之前,官方是不会有任何动作的。即便是 25H1 开始有支持的计划,那其实也够呛,按照以往的经验,alpha 至少半年,beta 至少一年……更何况,这是理想状况下了。

从技术上:其实很难真正实现对 ArkUI 的互操作性的支持。

从社区的角度,要想做到让鸿蒙真正的支持 cmp,无非就是给出一套和 Compose Web 一样的方案。

Jetbrains 是从两个方向来支持 web 的,一个是将 Compose 基于 Skia-WASM 绘制在 html-canvas 中;同时提供 Compose HTML 这套技术方案。

因此基于 Jetbrains 团队的历史决策惯性来说,大概率也是趋同于 Web:

  1. 首先基于 Skia 来实现绘制 CMP

    目前 HarmonyOS 官方的 XComponentNativeWindow 已经明确有对 OpenGL ESdemo)的支持,对 Vulkan(demo)的支持也有,但好像没 OpenGL ES 那么完善。因此二者都可以作为 Skia 的 Backend。
    这方面理论上可以走完全的 Native,性能应该不低,特别是华为官方的Graphics Accelerate Kit有内置的插帧技术,所以流畅性应该也不是问题。

  2. 然后可能还会给出一套 Kotlin/Compose Ark 的开发方案,有以下几种可能性:
    1. 首先分析一下目前社区使用 kotlin/js 的方案:

      这方面不确定会用 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” 作为一个目标。

    2. 直接面向“UI 后端引擎(C++)”来做 Compose Ark 的开发:
      1. 这首先要让 Kotlin Native 足够完善。这方面的工作量其实不少:
        1. 一方面是指令集,正如 Kotlin Native 要支持 macos/ios 需要支持 x86_64 和 arm64 两种指令集一样;未来 Kotlin Native 要支持 HarmonyOS 也需要支持 arm64/risc-v(但好在 risc-v 是兼容 x86、armv8 和 amd64 指令集的,所以短期内支持 arm64 也就够了)。
        2. 再一方面是互操作性,这是最困难的,虽然底层都是 C/C++,这方面标准是互通的,但是因为 HarmonyOS 有自己的一套系统级的接口,包括 N-API 用于实现与 ts/js 的互操作;以及各种OH_开头的接口,都需要映射到 Kotlin 的开发中来。
      2. 然后需要对 ace_engine 进行包装,实现一套与 ArkUI 趋同的开发体验,同时又是 Native 级别的组件,可以通过 NAPI 暴露给 ArkTS 来调用。
        1. 难点 ArkUI 的状态管理、标准组件都是用 ts 开发的,Kotlin Native 难道要自己实现一套?
        • 参考资料:如何新增一个组件 描述了基于 C++开发组件,并且通过 N-API 暴露给 ArkTS 调用。

综合以上的讨论,可以发现不论是 kotlin/js 还是 kotlin/native,都不是好的选择。
可以说如果 Kotlin 想要做好对 HarmonyOS 的支持,所要付出的成本是非常高的,这已经与 Kotlin 的发展策略有冲突了,不是本文能预测的范围内。
我只能得出结论说 CMP 短期内别想支持 HarmonyOS;而把 Kotlin Native 作为一个原生开发的接口库还算有可能,拿来做 UI 开发就别想了。

@kingsword09
Copy link
Contributor

所以感觉还是 DUI + Kotlin Native 感觉更理想一点,可以发挥各个平台原生UI的优势 🙈
原生鸿蒙 10月8号 公测了

@kingsword09
Copy link
Contributor

参阅资料更新:

  1. 鸿蒙生态应用开发白皮书 3.0 日期:2024-08-15

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants