把 DeepSeek Harness 搬进鸿蒙的 8 个坑

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

现象 :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 禁 symlink symlinkSync 报 EACCES 沙箱禁符号链接 回退 cpSync 拷贝
3 打包超限 5 万小文件卡死 HAP 对海量小文件不友好 打 tar.gz + 流式解压
4 ABI 不匹配 原生模块加载失败 产物是 win32-x64 stub / 禁用 / 换 aarch64
5 HOME 越界 选工作区 EPERM homedir 指向沙箱外 HOME 指向 userData
6 特权 403 settings 报 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 项一次通过的全过程。关注公众号并设为星标,别错过。

相关开源工程:

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

相关推荐
垆边人似月.1 小时前
华为机考题(一):质数因子
算法·华为
Francek Chen1 小时前
【华为Mate90系列】麒麟9050Pro首秀!Mate90系列及多款新品正式发布
人工智能·华为·harmonyos·鸿蒙7·麒麟芯片
李游Leo1 小时前
HarmonyOS 7 + ArkUI GridRow-ListScroller:折叠切换中的列表视口锚点与布局事务【鸿蒙心迹】
华为·harmonyos
OH_TPC12 小时前
HarmonyOS APP开发---“智泊“智能停车App,需要用到这个库
华为·harmonyos·鸿蒙
tsqtsqtsq030916 小时前
鸿蒙应用开发配置文件详解
harmonyos
贾伟康17 小时前
【HarmonyOS 7新能力|066】弱网直播优化实战:从网络感知到码率、缓冲与恢复
音视频·harmonyos·arkts·网络优化·弱网直播
m0_7381858218 小时前
Flutter 鸿蒙化实战:flutter_exif_plugin 适配 OpenHarmony,图片 EXIF 读写
flutter·华为·harmonyos·鸿蒙
动物园猫18 小时前
Compose Multiplatform 三方库 KoalaPlot(koalaplot-core)的 OpenHarmony 鸿蒙化适配实战
华为·harmonyos