上篇《保姆级:从 0 到 1 用 Electron 封装 DeepSeek Harness》结尾,我立了个 flag:把同一个 dsh 搬上鸿蒙真机。这篇来兑现,先给结论:在鸿蒙 2in1 上,dsh 的 Web UI 已经完整跑起来了——多会话、工具调用、文件读写、插件市场全可用,而架构几乎没动。

看完这篇,你会拿到一份可照抄的鸿蒙化规划。本文先给全景图:三层难点、为什么只换运行时、4 阶段构建、补丁为什么涨到 14+;后面每篇深挖一层。

先泼盆冷水:三层难点

动手前我必须说实话:这是我做过最「绕」的一次鸿蒙化。 难点分三层。

第一层,系统级差异。 沙箱禁 symlink、禁硬链接,loopback 网络隔离,HAP 打包 5 万小文件会卡死。这不是改两行代码能解决的,得靠一堆补丁一层层绕。

第二层,权限与安全。 ACL 权限审核相当严格;而「二进制证书」个人开发者根本拿不到,直接堵死「随包自带 Node / npm / pnpm / Python / pip / uv 等运行时和工具」这条路。

第三层,合规上线,地狱级。 商标撞名、ArkWeb 合规、AI 资质、APP 备案,一道坎接一道。这一层我到现在还在跑流程。

好在还有一张底牌:开源工程 harmonypc-electron 已经把 Electron(Node + Chromium)跑进了鸿蒙 HAP,否则光「跑起一个 Electron 桌面壳」就得自己啃原生 SO 交叉编译、ArkTS 桥接、渲染面三块硬骨头。

真正的问题变成:怎么规划,才能既复用 desktop 架构,又扛得住这三层坑?

一、目标:鸿蒙上的一等公民

目标很朴素:让 DeepSeek Harness(dsh)这个 AI Agent 工作台,在鸿蒙 2in1 / 平板上像一等公民桌面应用一样运行。

注意,不是「套个浏览器壳指向 localhost」的粗壳,而是对标 desktop 版:dsh Host 跑在应用进程里,桌面能力直接订阅它的内部事件。

二、题眼没变:同源数据面

搬到鸿蒙,我最担心的是 desktop 那套架构还能不能用。

答案是能,因为题眼没变——dsh 已经完成 Host/Client 分层,它的 webserver 同时服务 SPA 前端页面和 /api 接口。渲染进程只要加载同一个地址,fetch('/api/xxx') 和 WebSocket 就是同源的:零 CORS、零鉴权、零自定义协议、零新增 IPC。

这一条跟桌面端一模一样。所以鸿蒙版骨架直接抄 desktop:主进程里 runProfile('desktop') 挂起 dsh Host,渲染进程 loadURL 到同一个端口,跑未经修改的标准 dsh Web UI。

三、唯一的变化:换运行时

与 desktop 的差异只有一处本质变化:把官方 Electron 运行时换成 Electron-on-鸿蒙运行时(harmonypc-electron)。

维度desktopharmony
运行时官方 Electron(npm 依赖)harmonypc-electron(构建期 copy)
UI 加载loadURL(localhost) 同源同(局域网 IP + Host 改写)
后端进程主进程内 Host同
构建分发Electron Forgehvigor 产 HAP + hdc 安装

除运行时和构建外,其余维度完全同构,这就是「只换壳」。

为什么选 harmonypc-electron?一句话:dsh 依赖 Node 22+ 的 zlib.createZstdDecompress 解压会话产物,而 Electron 34 只带 Node 20.18.1,没有这能力。harmonypc-electron 用的是 Electron 37 / Node 22.17.0,刚好满足。

四、4 阶段构建流水线

鸿蒙的构建跟 Electron Forge 完全不是一回事,我把整条流水线拆成 4 个阶段:

⓪ collect-runtime   同步 Electron-on-鸿蒙运行时(copy 模块 + 3 个 SO)
① build-dsh         patch + 构建 dsh + dsh-market
② collect-dsh       收集 dsh 产物 + 注入 better-sqlite3 + 写 sharp stub
③ tar               压成 dsh-dist.tar.gz
④ hvigor            构建 + 签名 → HAP

第 ③ 步最反直觉:dsh 产物有 5 万多个小文件,直接让 hvigor 打包卡死。解法是先把整个 dsh-dist 压成一个 约 143MB 的 tar.gz,运行时再流式解压。

五、补丁从 6 到 14+

desktop 版只需要 2 个补丁。鸿蒙版我一开始规划 6 个,落地一路涨到 14+ 个。

为什么?因为鸿蒙的沙箱和网络模型,跟桌面 Linux 完全不是一回事:

  • 沙箱禁 symlink(EACCES)→ dsh 初始化失败,回退 cpSync 递归拷贝
  • 沙箱禁硬链接 → 会话日志发布回退 rename
  • loopback 网络隔离 → 渲染进程访问 127.0.0.1 被拦,webserver 绑 0.0.0.0 + 走局域网 IP
  • 还有给 ctx.fs 补删除 / 写字节 / chmod 原语、lefthook、欢迎页、附件 fsync 兜底……

这些坑后面「适配踩坑」篇逐个展开,每个都贴报错原文和解法。只需记住:补丁数量不是越少越好,它是「鸿蒙跟桌面差异有多大」的直接度量。

六、MVP 取舍:三桩一换

鸿蒙 aarch64 上,dsh 的三个原生模块都没有对应二进制。MVP 阶段的取舍:

能力依赖取舍
图片附件sharp(libvips)纯 JS stub(解析容器头,不解码)
终端(bash 工具)node-pty禁用
进程沙箱koffi(landlock)禁用
会话持久化better-sqlite3✅ 换用 Electron 37 / ABI v138 成品

「三桩一换」:三个能力牺牲,但最关键的会话持久化用 better-sqlite3 的 aarch64 成品保住了。

七、真机验证

在鸿蒙 2in1 真机(HarmonyOS 6.1.0.135 / API 24)上验证通过:Electron 37 / Node 22.17.0,dsh Host 启动,渲染进程加载 Web UI 成功,多会话、agent、工具调用全可用。

八、写在最后

以上就是把 DeepSeek Harness 搬进鸿蒙的完整工程规划:架构抄 desktop,只换运行时,4 阶段构建,14+ 个补丁,三桩一换,真机跑通。

如果你也在琢磨把某个 Electron 应用或 Node agent 框架搬进鸿蒙,这套「进程内 Host + 同源数据面 + 换运行时」的思路可直接抄。

代码已开源:https://github.com/fellow99/deepseek-harness-harmony 。4 阶段构建脚本、全部补丁、真机验证步骤都在里面,点个 star,就能顺着这份规划抄到真机跑通。

下一篇我写 Electron-on-鸿蒙运行时拆解:把 Electron 跑进鸿蒙电脑的那个运行时,到底是怎么搭起来的。关注我,别错过。

感谢各位关注,欢迎访问我的GitHub主页:https://fellow99.github.io/

相关开源工程:

  • DeepSeek Harness(上游项目):https://github.com/deepseek-ai/deepseek-harness
  • dsh-market(插件市场):https://github.com/dsh-market/dsh-market
  • harmonypc-electron(Electron-on-鸿蒙运行时):https://atomgit.com/jianguoxu/harmonypc-electron
  • deepseek-harness-workspace(工作区总览):https://github.com/fellow99/deepseek-harness-workspace
  • deepseek-harness-desktop(桌面端):https://github.com/fellow99/deepseek-harness-desktop
  • deepseek-harness-harmony(鸿蒙端):https://github.com/fellow99/deepseek-harness-harmony
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐