[Bug] 0.13.0-preview 实机反馈:ADB 控制被档位卡死 / 重启掉线 / @napi-rs/canvas 缺失 / 插件市场可搞垮引擎
项目:kelai141/dsh-mobile-apk · 版本:0.13.0-preview(com.dsharnessmobile.shell)
设备:OPPO K13 Turbo Pro 5G(PLE110)· Android 16(ro.build.version.release=16, SDK 36)
环境
- DSH:
0.13.0-preview(versionCode 24)
- ADB 无线调试:开启
- 用户通过
dsh plugin / 插件市场使用部分功能
🐛 Bug 1:android_* 工具(ADB 观察/控制)显示 [object Object] / 空数据,且无法把会话档位切到 danger-full-access
触发方式:在对话中调用 android_adb_shell_exec / android_termux_channel_exec / android_device_info / android_privilege_status 等工具。
现象:
android_adb_shell_exec(如 getprop ro.product.model)返回字面量 [object Object][object Object]。
android_device_info 返回 (未知)——model=? ver=? sdk=? focus=? res=?(全是空),而同样的命令通过 adb shell(bash 通道)能正常取到 PLE110 / Android 16 / SDK 36。
android_privilege_status 显示:授权档位 T0——已授权(引擎级)——当前部署档位 workspace-write,会话内档位实时判定(/permission danger-full-access 可即时开放)。
分析(已排查到根因):
- 这些「观察类」ADB 工具要求会话档位 =
danger-full-access 才开放;但当前会话档位一直停在 workspace-write(T0),于是这些工具被 fail-closed。
- 问题在于无法切换档位:
- 在会话里输入
/permissionPresets danger-full-access(官方 dsh-permission-presets 注册的命令)→ 被当成普通文本发给 agent,不被识别为指令。
- 「开发者选项 → 会话档位(ADB 能力开关·实时)」显示
workspace-write 的胶囊点击无反应。
- 已确认
sandbox/mode(会话档位)在会话创建时固定(dsh-permission-presets 文档:later changes never alter an existing session),所以当前会话锁死在 workspace-write。
- 由于档位锁死 + 命令不被识别 + UI 胶囊点不动,用户无法在已存在会话内开启 ADB 能力。
[object Object] 是 fail-closed / 结果渲染层的表现。
解决:
- 未解决(功能性):已存在会话无法把档位切到
danger-full-access;只能开新会话(且把 settings.yaml 的 permissionPresets.defaultPreset 设为 danger-full-access)才可能开放。
- 建议:①
/permissionPresets 命令应在手机/WebView 环境被正确识别为命令(而非文本);②「会话档位」胶囊应是可点的选择器;③ 或提供一个「本会话实时切到 danger-full-access」的入口(当前只有 future-session 默认值生效)。
🐛 Bug 2:设备重启后 ADB 无线调试连接自动丢失,端口变化,需手动重新配对
触发方式:手机整机重启后,再进入对话调用 ADB。
现象:
adb devices 为空;adb connect 127.0.0.1:<旧端口> 返回 Connection refused。
- 无线调试的端口变了(实测
40601 → 39589)。
- 需手动重新配对:
adb pair 10.10.14.1:<配对端口> <配对码> + adb connect 127.0.0.1:<新端口>,并把 connectPort 更新进壳侧 dsh-adb.xml 才能恢复。
- 恢复后
adb shell getprop ro.product.model 正常,但每次重启都要重来一遍。
分析:Android 无线调试每次重启会分配新的随机端口;壳侧 dsh-adb.xml 存的是上次的 connectPort,不会自动跟随刷新;且授权(配对)在重启后需重新建立。
解决:
- 手动重新配对 + 更新
connectPort 可恢复(但它依赖当次屏幕上的配对码/端口)。
- 建议:① 重启后自动重扫无线调试端口 / 自动重连;② 或提供引导页让用户一键重新配对(而非靠手动改
dsh-adb.xml);③ ADB 通道在 0.13.0 正式版才「完整」,当前 preview 属预期未完成,但建议至少自动适配端口变化。
🐛 Bug 3:web 启动报 Cannot load "@napi-rs/canvas"(pdfjs PDF 渲染)
触发方式:重启 dsh web 服务。
现象:
Warning: Cannot load "@napi-rs/canvas" package: "Error: Cannot find module '@napi-rs/canvas'
Require stack: .../node_modules/pdfjs-dist/legacy/build/pdf.mjs"
Warning: Cannot polyfill `DOMMatrix`, rendering may be broken.
Warning: Cannot polyfill `ImageData`, rendering may be broken.
Warning: Cannot polyfill `Path2D`, rendering may be broken.
分析:@napi-rs/canvas(pdfjs 解析 PDF 的可选原生依赖)不在 package.json 的 dependencies 里(重启时 dependencies 为 {}),因此被当作孤儿包安装/清理时移除。
解决(手动):
- 在 web profile 的
package.json dependencies 写入 @napi-rs/canvas@^1.0.8,pnpm add @napi-rs/canvas(自动装 @napi-rs/canvas-android-arm64 原生绑定),node 实测 createCanvas 绘制 OK、DOMMatrix/ImageData/Path2D 可用,pdf.mjs 加载零警告。
- ⚠️ 需要再重启一次才吃掉修复(当前运行中的服务是在加包前启动的)。
建议:把 @napi-rs/canvas 及其 arm64 原生绑定写进出厂快照的 package.json dependencies,避免每次重启又丢。
🐛 Bug 4:插件市场安装 @zseven-w/dsh-android 后引擎崩溃两次,需 Termux 手动修复
触发方式:从插件市场安装 @zseven-w/dsh-android 0.1.0-rc.4(对话内实时设备流 / 20 个 adb 工具),重启后。
现象:
- 引擎/web 环境损坏,聊天记录丢失,用户需用 Termux 手动修复两个小时。
- 该插件安装后把
cordis.patch.yml / bundles 改掉,插件卸载后仍留残留;撤到「出厂原版」才恢复。
- (期间还叠加了「插件市场列的插件多数在手机上不兼容」——README 已说明,但一个插件就能把引擎搞垮。)
分析:
- 插件市场对手机端不兼容的插件缺乏足够防护/隔离;装一个第三方插件就可能(a)影响
cordis.yml/cordis.patch.yml 底层配置(b)拖垮引擎(c)无可靠一键回滚。
dsh-undo-savepoint 在该场景常报「无快照可回滚」,关键时刻兜不住。
解决:
- 手动:全部卸载相关包/配置,恢复到出厂 patch(用户用 Termux 完成)。
- 建议:① 插件市场对手机不兼容的插件做更明显的风险标识 / 安装前二次确认;② 增强
dsh-undo-savepoint在「插件装坏」场景的回滚可靠性;③ 加「一键恢复出厂」兜底。
小结
- Bug 1(ADB 档位卡死 +
[object Object]/空数据 + 无法切档)是本次最影响使用的:ADB 观察/控制不可用,只能绕走 bash adb 通道;建议优先处理「会话档位切换入口」。
- Bug 2、3 是重启后可恢复、但体验差(掉线重配 / canvas 依赖丢失)。
- Bug 4 是第三方插件兼容/隔离问题,风险高,建议加固插件市场 + 回滚。
以上为 0.13.0-preview 在真机上遇到的问题反馈,供开发者参考。若需要更多日志/复现步骤,我可以补充。
[Bug] 0.13.0-preview 实机反馈:ADB 控制被档位卡死 / 重启掉线 / @napi-rs/canvas 缺失 / 插件市场可搞垮引擎
环境
0.13.0-preview(versionCode 24)dsh plugin/ 插件市场使用部分功能🐛 Bug 1:
android_*工具(ADB 观察/控制)显示[object Object]/ 空数据,且无法把会话档位切到danger-full-access触发方式:在对话中调用
android_adb_shell_exec/android_termux_channel_exec/android_device_info/android_privilege_status等工具。现象:
android_adb_shell_exec(如getprop ro.product.model)返回字面量[object Object][object Object]。android_device_info返回(未知)——model=? ver=? sdk=? focus=? res=?(全是空),而同样的命令通过adb shell(bash 通道)能正常取到PLE110/ Android 16 / SDK 36。android_privilege_status显示:授权档位 T0——已授权(引擎级)——当前部署档位 workspace-write,会话内档位实时判定(/permission danger-full-access 可即时开放)。分析(已排查到根因):
danger-full-access才开放;但当前会话档位一直停在workspace-write(T0),于是这些工具被 fail-closed。/permissionPresets danger-full-access(官方dsh-permission-presets注册的命令)→ 被当成普通文本发给 agent,不被识别为指令。workspace-write的胶囊点击无反应。sandbox/mode(会话档位)在会话创建时固定(dsh-permission-presets文档:later changes never alter an existing session),所以当前会话锁死在 workspace-write。[object Object]是 fail-closed / 结果渲染层的表现。解决:
danger-full-access;只能开新会话(且把settings.yaml的permissionPresets.defaultPreset设为danger-full-access)才可能开放。/permissionPresets命令应在手机/WebView 环境被正确识别为命令(而非文本);②「会话档位」胶囊应是可点的选择器;③ 或提供一个「本会话实时切到 danger-full-access」的入口(当前只有 future-session 默认值生效)。🐛 Bug 2:设备重启后 ADB 无线调试连接自动丢失,端口变化,需手动重新配对
触发方式:手机整机重启后,再进入对话调用 ADB。
现象:
adb devices为空;adb connect 127.0.0.1:<旧端口>返回Connection refused。40601→39589)。adb pair 10.10.14.1:<配对端口> <配对码>+adb connect 127.0.0.1:<新端口>,并把connectPort更新进壳侧dsh-adb.xml才能恢复。adb shell getprop ro.product.model正常,但每次重启都要重来一遍。分析:Android 无线调试每次重启会分配新的随机端口;壳侧
dsh-adb.xml存的是上次的connectPort,不会自动跟随刷新;且授权(配对)在重启后需重新建立。解决:
connectPort可恢复(但它依赖当次屏幕上的配对码/端口)。dsh-adb.xml);③ ADB 通道在0.13.0正式版才「完整」,当前 preview 属预期未完成,但建议至少自动适配端口变化。🐛 Bug 3:web 启动报
Cannot load "@napi-rs/canvas"(pdfjs PDF 渲染)触发方式:重启 dsh web 服务。
现象:
分析:
@napi-rs/canvas(pdfjs 解析 PDF 的可选原生依赖)不在package.json的dependencies里(重启时dependencies为{}),因此被当作孤儿包安装/清理时移除。解决(手动):
package.jsondependencies写入@napi-rs/canvas@^1.0.8,pnpm add @napi-rs/canvas(自动装@napi-rs/canvas-android-arm64原生绑定),node实测createCanvas绘制 OK、DOMMatrix/ImageData/Path2D可用,pdf.mjs 加载零警告。建议:把
@napi-rs/canvas及其 arm64 原生绑定写进出厂快照的package.jsondependencies,避免每次重启又丢。🐛 Bug 4:插件市场安装
@zseven-w/dsh-android后引擎崩溃两次,需 Termux 手动修复触发方式:从插件市场安装
@zseven-w/dsh-android 0.1.0-rc.4(对话内实时设备流 / 20 个 adb 工具),重启后。现象:
cordis.patch.yml/ bundles 改掉,插件卸载后仍留残留;撤到「出厂原版」才恢复。分析:
cordis.yml/cordis.patch.yml底层配置(b)拖垮引擎(c)无可靠一键回滚。dsh-undo-savepoint在该场景常报「无快照可回滚」,关键时刻兜不住。解决:
dsh-undo-savepoint在「插件装坏」场景的回滚可靠性;③ 加「一键恢复出厂」兜底。小结
[object Object]/空数据 + 无法切档)是本次最影响使用的:ADB 观察/控制不可用,只能绕走 bashadb通道;建议优先处理「会话档位切换入口」。以上为 0.13.0-preview 在真机上遇到的问题反馈,供开发者参考。若需要更多日志/复现步骤,我可以补充。