☰
把 DeepSeek Harness 搬进鸿蒙的 8 个坑
2026/10/2 20:55:33 网站建设 项目流程

直接说结论:把 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/

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询