直接说结论:把 DeepSeek Harness 搬进鸿蒙,坑不在 Electron,在鸿蒙的沙箱和网络模型。

桌面 Linux 上理所当然的事——symlink、硬链接、访问 127.0.0.1、HOME 目录——到了鸿蒙上全被改了规矩。我数了数,能靠补丁 + 插件绕过去的有 8 个坑;但有少数几个是真·绕不过去的坎,比如「随包自带 Node、npm、pnpm、Python、pip、uv 等运行时和工具」。

这个坎我第一篇文章就埋过伏笔(当时叫它「第二层难点」),根因是二进制证书个人开发者不可得,后面 ACL 篇我会单独讲透。这篇先把 8 个能绕过去的坑一个个拆开。


一、先把背景对齐:为什么是这 8 个坑

我的目标是复用 desktop 那套架构(进程内 Host + webserver + 同源数据面),把 dsh 原样搬进鸿蒙。唯一本质差异是把「官方 Electron 运行时」换成「Electron-on-鸿蒙运行时」。

结果这「换一个运行时」引出一串连锁反应:沙箱禁了 symlink、回环地址被隔离、打包阶段被 5 万个小文件卡死、原生模块全是 win32 二进制……下面按「现象 → 原因 → 解决」逐个拆。


二、8 个坑逐个拆

坑 1:loopback 网络隔离

现象:渲染进程加载 127.0.0.1:<端口> 直接白屏,Web UI 加载失败。

原因:鸿蒙对渲染进程访问本机回环地址做了进程间网络隔离,桌面版「同源加载 localhost」的老路子走不通了。

解决:webserver 绑 0.0.0.0,渲染进程改走局域网 IP;出栈前再把 Host / Origin 改写回 127.0.0.1:<端口>,以通过 dsh 的 loopback-only 特权方法围栏。安全语义不变——局域网其他设备依然 403。

坑 2:沙箱禁 symlink

现象:symlinkSync 直接抛 EACCES,dsh 初始化阶段就失败。

原因:鸿蒙应用沙箱禁止创建符号链接(这也解释了后面坑 4 里 hardlink 相关的问题)。

解决:加 patch,symlink 失败时回退 cpSync 递归拷贝。牺牲一点磁盘空间,换来初始化不再崩。

坑 3:HAP 打包超限(5 万个小文件)

现象:dsh 构建产物有 5 万多个小文件,hvigor 打包阶段直接卡死、内存爆掉。

原因:鸿蒙的 HAP 打包流程对海量小文件不友好,node_modules 那种「文件多、单个体积小」的结构是它的天敌。

解决:先把整个 dsh-dist 压成单个 dsh-dist.tar.gz(约 143MB,--format=ustar),运行时再流式解压。把「5 万次小文件搬运」变成「一次大文件搬运 + 一次流式解压」。

坑 4:原生模块 ABI 不匹配(卡了我一整天)

现象:sharp / node-pty / koffi 这些原生模块,在 Windows 上收集产物时是 win32-x64 二进制,到了鸿蒙 aarch64 上根本加载不了,直接报错。

原因:dsh-dist 是在 Windows 上收集的,原生模块的二进制平台被锁死在 win32-x64。

解决(三条路,这个坑我最久才爬出来):

  • sharp → 换成纯 JS stub:不做事像素解码,只解析图片容器头,干净的 8-bit sRGB PNG/JPEG/WebP 直接按字节直通。
  • node-pty / koffi → 直接禁用对应能力(终端、进程沙箱)。
  • better-sqlite3 → 换用 Electron 37 / Node ABI v138 的 aarch64 成品,会话持久化保住了。

这个坑最折磨人的地方在于:它不是「装错了东西」,而是「你装的东西从根上就是错的平台」,得一层层溯源到「产物是在哪台机器上收集的」。

坑 5:HOME 指向沙箱外

现象:一打开「选择工作区」就报 cannot list /storage/Users/currentUser: EPERM。

原因:鸿蒙沙箱里 os.homedir() 返回的是沙箱外的系统用户目录,应用无权访问,一点进去就 EPERM。

解决:dsh Host 启动前把 HOME 显式指向沙箱可写目录 userData,让「工作区选择」落在应用自己能读写的范围内。

坑 6:特权方法 403

现象:设置对话框多处报 transport failure for /api/settings.describe: HTTP 403。

原因:dsh 把 settings.*、credentials.* 等特权方法锁定为 loopback-only,而鸿蒙为了绕坑 1 的 loopback 隔离改走了局域网 IP,Host 头不是 loopback → 直接被 403。

解决:在内嵌渲染进程请求出栈前,把 Host / Origin 改写为 127.0.0.1:<端口>。坑 1 和坑 6 其实是同一枚硬币的两面:一个要「绕开 loopback」,一个要「装成 loopback」。

坑 7:agent preset 工具行无限等待

现象:加完工作区点不了,session.create 抛 agent-preset-invalid。

原因:standard preset 里 tool-bash、tool-fs-search 依赖被禁用的 shell/subprocess(node-pty,坑 4 已禁),于是无限等待 → preset 挂载失败。

解决:禁用依赖 shell / subprocess / pty 的工具行。禁用要「整行摘掉」,别只摘工具名,否则 preset 解析还会卡。

坑 8:corepack pnpm 不可用

现象:desktop 构建用的是 corepack pnpm,到了鸿蒙构建环境 corepack 直接不可用。

原因:corepack 依赖下载/切换 pnpm 版本的机制,在鸿蒙构建环境里走不通。

解决:构建脚本直接调 pnpm,跳过 corepack 这一层。别在鸿蒙环境里跟 corepack 死磕,能省一天。


三、8 个坑速查表

坑现象根因解决
1 loopback 隔离渲染进程白屏回环地址进程间隔离绑 0.0.0.0 + 局域网 IP
2 禁 symlinksymlinkSync 报 EACCES沙箱禁符号链接回退 cpSync 拷贝
3 打包超限5 万小文件卡死HAP 对海量小文件不友好打 tar.gz + 流式解压
4 ABI 不匹配原生模块加载失败产物是 win32-x64stub / 禁用 / 换 aarch64
5 HOME 越界选工作区 EPERMhomedir 指向沙箱外HOME 指向 userData
6 特权 403settings 报 403特权方法 loopback-only出栈改写 Host/Origin
7 preset 卡死agent-preset-invalid依赖被禁的 shell/subprocess禁用依赖 pty 的工具行
8 corepack 不可用pnpm 拉不起来corepack 机制走不通直接调 pnpm

一句话记住:鸿蒙化难的不是 Electron,是沙箱和网络模型逼着你换一套心智模型。


四、还有几个绕不过去的坎

上面 8 个坑都能绕。但有 3 个坎,绕过去得另辟蹊径:

  1. 二进制证书个人不可得——随包分发 ELF(Node / pnpm / Python 运行时)需要二进制证书,个人开发者拿不到。这条是真·绕不过去,「随包自带完整工具链」只能放弃(下一篇 ACL 篇讲透)。
  2. 应用域 node 子进程被 SIGSYS 杀——沙箱 seccomp 策略禁止 fork 出的子进程分配 JIT 可执行内存,node 一创建 V8 isolate 就被内核打死,所以「在应用里 spawn 一个 node/pnpm 子进程」走不通。
  3. 用户数据分区禁 exec ELF——就算弄来 linux-arm64 原生 pnpm,也塞不进用户目录。

这三个坎叠一起,把「插件市场一键安装」逼到了墙角。其中第 2、3 个我正在尝试解决(思路是把「spawn 子进程」改成「在主进程内进程式调用 pnpm」)——这个坑够单独写一篇专题,这里先点到为止。


五、写在最后

以上就是把 DeepSeek Harness 搬进鸿蒙的 8 个坑,外加几个还没完全啃完的坎。如果你也在做鸿蒙 / Electron-on-鸿蒙的适配,这份清单照着查一遍,能少踩不少。

代码已开源:https://github.com/fellow99/dsh-desktop-hos,欢迎 star 支持。

下一篇我写 ACL 权限申请踩坑:哪些权限才需要申请、我差点白交一批、以及最后 3 项一次通过的全过程。关注公众号并设为星标,别错过。

相关开源工程:

  • 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
  • dsh-desktop(桌面端):https://github.com/fellow99/dsh-desktop
  • dsh-desktop-hos(鸿蒙端):https://github.com/fellow99/dsh-desktop-hos

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

Logo

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

更多推荐