Passer au contenu principal
H

dsh-android-pane

hoyyang/dsh-android-pane

Volet Android en direct à côté de la conversation DSH : flux H.264 scrcpy et taps de l’agent vérifiés par captures d’écran et arbre UI. Captures, enregistrements et preuves de débogage sont enregistrés dans un seul dossier hôte. Les sessions de débogage conservent vidéo segmentée, logcat complet et images par action. Émulateurs et téléphones USB pris en charge, coopération humain-agent, loopback uniquement.

Installer

dsh plugin --profile web add github:hoyyang/dsh-android-pane

README

dsh-android-pane

banner

在 DeepSeek Harness(DSH)对话旁打开一块 Android 实时画面面板:模拟器和 USB 真机通吃,agent 能点按操作并用截图 + 控件树自证改动,你也能随时上手共操作;截图、录屏、调试证据直接存进你指定的电脑目录。

English · Releases · 更新日志

License: MIT Release Platform

安装

dsh plugin add github:hoyyang/dsh-android-pane

零配置:不需要 API Key、不需要改 DSH 配置。需要 adb 在 PATH(Android SDK),一台开了 USB 调试的设备或任一模拟器;macOS/Linux + DSH web profile。调试分析的抽帧需要宿主有 ffmpeg / ffprobe。Linux 的目录选择需要 Zenity 或 KDialog。

适合 / 不适合

  • 适合:你想让 agent 真的去点 Android 手机并给出证据;你要在 DSH 里随时看设备画面并接手操作;你需要把截图/录屏/调试日志留档到固定目录。
  • 适合:你要复现用户反馈的点击路径、验收 UI 改动、录制崩溃前的操作序列。
  • 不适合:只想看静态截图(用系统截屏更快);需要 root 级注入或修改系统(本插件不自动 root);需要跨网络远程控制(只允许本机回环访问)。

核心功能

  • 一份真正的右侧列:停靠形态排在「会话 | 右侧边栏 | Android 面板 | 卡片详情」的第三格,不盖会话、不被详情盖;窄窗(<1000px)自动转浮窗。
  • 设备选择下拉:标题栏列出在线设备名称与型号,切换设备即重建串流。
  • 完整路径条:顶部常驻当前保存目录,长路径换行显示不省略,右侧齿轮直接打开目录设置。
  • 底部设备键栏:返回、主屏幕、最近任务、输入文字、静音与最近保存六个入口常驻,不随画面滚动。
  • 实时画面:scrcpy-server H.264 直推 DSH 网页端,WebCodecs 硬解;scrcpy 起不来时自动降级为截图轮播。
  • 面板内真实输入:H.264 画面上的按下、拖动、抬起直接注入设备,滚轮按像素/行/页归一;截图降级模式保留抬手后合成手势。
  • 设备按键与中文输入:返回 / 主屏 / 最近任务 / 旋转 / 音量键;一次性安装 ADBKeyboard 后中文经剪贴板输入。
  • 元素级操作:android_pane_ui 按文本模糊匹配控件,返回权威坐标后再点击,避免盲点打偏。
  • 截图直接落盘:一次点击保存 PNG 到统一目录,成功后显示完整路径,而不是另开图片标签。
  • 普通录屏落盘:开始计时、停止保存 MP4;180 秒到期自动保存,期间仍可截图与操作设备。
  • 调试会话落盘:分段 MP4 + 全量 logcat + 操作时间线,同一前缀、同一目录。
  • 调试分析取证:逐动作前后帧 + 日志切片,帧时刻来自设备时钟与录屏内嵌时间元数据;取不到就写明,不伪造前后对应。
  • 统一保存目录:Desktop 桥 / 宿主选择器选目录,选中只回填,保存设置生效;采集期间锁定,失败可换目录重试。
  • 待保存可恢复:录屏/调试的待保存意图写入宿主持久状态,进程重载后仍能继续保存。
  • 媒体静音与恢复:一键静音设备媒体,再点恢复原音量;不代表来电/闹钟静音。
  • 受保护页面降级:识别 FLAG_SECURE,横幅说明限制并提供可点按的控件树文本视图,不自动 root。
  • 人机互斥:设备被 agent 认领期间面板输入被拒绝,可显式接管;释放与重连后恢复。
  • 断连不假装成功:设备断开时采集与操作明确报错;重连后画面与主操作自动恢复。

30 秒快速上手

  1. 手机开 USB 调试并连电脑(或启动任一模拟器)。
  2. 在 DSH 会话头部点「Android 面板」。
  3. 面板自动选中在线设备并开始串流;也可以在下拉里切换设备。
  4. 直接在画面上点按、拖动、滚动——和真机操作一致。
  5. 让 agent 说「连接我的安卓设备」,它会认领设备并接管输入。
  6. 点「截图」,面板底部显示「已保存:/完整路径.png」。
  7. 点「录屏」,按钮原位变「停止 00:05」;再点保存 MP4。
  8. 点「调试」开始留证;做几步操作后再点停止,视频、日志、时间线一起落盘。
  9. 想让 agent 取证据时调用 analyze,它会拿到每个动作的前后帧与日志切片。
  10. 需要中文时先装输入法,再用文字入口发送;需要静音时点「静音」。
  11. 点顶部路径条右侧的齿轮,打开统一保存目录设置。
  12. 在设置里点「选择」挑一个可写目录,再点「保存设置」生效。
  13. 点底部文件夹按钮查看最近保存,图片与视频可直接预览。
  14. 设备被占用时点提示里的「接管」,或在面板外等待 agent 释放。
  15. 在画面上长按图标并拖动,设备会跟随移动。
  16. 点「重新连接设备」,断开的串流会自动恢复。
  17. 打开受保护页面,观察横幅提示与「查看控件树」入口。
  18. 在设置里切换画质清晰/流畅,确认画面尺寸随之变化。

使用场景

  • 复现用户反馈:按反馈路径在面板里点一遍,每步截图留档,交给 agent 对照日志分析。
  • 验收 UI 改动:改完直接看真机效果,逐屏截图存进统一目录。
  • 录制偶现问题:开始普通录屏,等复现后停止,MP4 直接可用。
  • 崩溃前操作序列:调试模式录屏 + 全量 logcat,事后按动作时间线回放。
  • 定位控件与文案:用控件树找到元素中心坐标,再让 agent 精确点击。
  • 中文输入链路验证:通过 ADBKeyboard 输入中文并回读 EditText。
  • 受保护页面演练:银行/密码类应用打开时观察横幅与控件树降级是否符合预期。
  • 多设备对比:切换设备复用同一套操作与保存目录。
  • 长时间任务留证:调试会话按 170 秒分段轮转,长任务不丢证据。
  • 失败恢复演练:把目录改成只读或断开数据线,验证失败提示、待保存与重试。
  • 对比改动前后:同一路径连续截图两次,肉眼比对改版差异。
  • 交接给同事:把统一目录里的 PNG/MP4/日志打包,别人无需复跑就能看懂操作序列。
  • 长期回归:每次发版跑一遍 npm test,并用真机点几条主路径。

运行结果

  • 截图实测产出一张 592×1280 的 PNG(约 165 KB),面板提示「已保存:完整路径.png」。
  • 普通录屏实测 38.3 秒产出 81 KB 的 MP4,ffprobe 显示 H.264 592×1280。
  • 调试会话实测产出两段视频:170.005 秒与 1.942 秒,同前缀命名。
  • 调试日志实测落地 123 行切片,完整未过滤日志另存为 logcat.log。
  • 调试分析为每个动作产出前后帧 PNG:6 个动作得到 6 张,帧时刻不确定度 41–129 毫秒。
  • 175 秒会话实测:分段时钟宽度 81 毫秒与 258 毫秒,6 帧全部校准、无顺序违规。
  • 失败时输出明确错误:受保护页面返回「受保护页面不可截图」,记录数不变。
  • 断连实测:冻结 adb 后截图报错且不登记;恢复后截图成功,产物写入统一目录。
  • 媒体静音实测:面板显示静音后设备媒体音量为 0,再点一次恢复原值。
  • 目录切换实测:把统一目录指到 /private/tmp/AndroidCaptures 后,新截图实际写入该目录。
  • 动作截断实测:14 个动作只分析最近 12 个,frameIssues 写明「更早的 2 个未取前后帧」。

输入输出对照

输入输出
点「截图」统一目录下的 PNG 与完整路径提示
「录屏」开始 → 停止MP4(180 秒到期自动保存)
「调试」开始 → 操作 → 停止分段 MP4 + logcat + actions.json
调用 analyzeframes/ 前后帧 PNG + 日志切片文本
android_pane_ui find控件节点列表与中心坐标
android_pane_ui click点击执行结果与截图路径
面板输入中文设备 EditText 实际内容与截图
设备断开后再操作明确错误信息,不产生成功记录

输入输出示例

$ node scripts/check-capture.mjs
PASS: persistent record/debug/volume recovery; state atomic upgrade, ... device-clock calibrated sparse-frame selection and fresh-frame acceptance
$ node scripts/check-input.mjs
PASS 15 input check groups (protocol, validation, lease, hub, coordinates/UI, queue, capture; no device/spawn)
$ curl -s http://127.0.0.1:3080/_dsh/dsh-android-pane/devices
{"ok":true,"devices":[{"serial":"<serial>","state":"device","model":"<model>","name":"<device>"}],"quality":{"maxSize":1280,"maxFps":30,"videoBitRate":8000000}}
$ curl -s http://127.0.0.1:3080/_dsh/dsh-android-pane/capture
{"ok":true,"directory":"/private/tmp/AndroidCaptures","record":null,"debug":null,"outputs":[...]}
$ adb devices
List of devices attached
<serial>	device
$ ffprobe -v error -show_entries format=duration -of csv=p=0 dbg-...-seg-000.mp4
170.004822
$ node -e "console.log(require('./package.json').version)"
0.2.0
$ npx tsc --noEmit -p . && echo typecheck-ok
typecheck-ok

进阶用法

  • 中文输入:android_pane_install_ime 一次性安装 ADBKeyboard,之后用文字入口发送中文。
  • 元素级操作:android_pane_ui 的 find/click/setText,按文本模糊匹配,替代盲点坐标。
  • 安全页面检测开关:config flagSecureCheck(默认 true)。
  • 画质设置:面板设置里切清晰/流畅,改变最大边与码率,重连后生效。
  • 串流恢复:串流卡住时点「重新连接设备」,或在设备菜单重选设备。
  • 浮窗与停靠:面板设置里切换形态;窄窗自动浮窗,恢复后回到右侧列。
  • 最近保存:底部文件夹按钮打开记录,可预览图片与视频。
  • 调试分析:停止调试后调用 analyze,拿逐动作前后帧与日志切片。
  • 保存失败重试:停止失败时面板保留待保存记录,换一个可写目录再点重试。
  • 卸载:dsh plugin remove dsh-android-pane,状态在 <DSH_HOME>/dsh-android-pane/,可整目录删除。

与同类对比

能力dsh-android-pane 0.2.1scrcpy 5.xscrcpy-mcpmobile-mcp
DSH 内嵌面板(右侧列/浮窗)有无(独立窗口)无无
H.264 实时串流有有有有
面板内真实触摸/滚轮有有无无
agent 工具(点按/控件树/中文输入)有无有有
截图/录屏直接落盘到统一目录有需自己拼命令部分部分
调试会话(分段录屏 + 全量 logcat + 时间线)有无无部分(日志)
受保护页面识别与控件树降级有无无无
人机互斥与接管有无无无

对比对象取自各项目公开 README 的能力声明;版本与实现会变,以各自文档为准。我方没有的能力照实写「无」。

可靠性与验收

  • npm test:采集回归(状态原子升级、固定目录、FLAG_SECURE 守卫、保存重试与分段轮转、登记与预览、旧实例竞态、时钟宽度边界、稀疏帧选择与新鲜帧校验)+ 15 组输入回归,全部通过。
  • npx tsc --noEmit 与 npm run build 通过;boot-check.sh 中本插件 [A][B][D][E] 项全 PASS。
  • 真机实测(多品牌 USB 真机与模拟器):H.264 串流、点按/拖动/滚轮、长按续租、媒体静音恢复、中文输入回读。
  • 175 秒调试会话实测:两段 170.005s + 1.942s,分段时钟 81ms / 258ms,6 帧全部校准、前后帧顺序无违规。
  • 14 动作会话实测:会话时钟缺失时 24/24 帧仍按分段时钟校准,动作截断与无新帧都有明确提示。
  • 受保护页面实测:识别 FLAG_SECURE,截图调用被明确拒绝,调试前弹「可能黑屏」确认。
  • 断连实测:冻结 adb 服务后截图报错且不登记,恢复后画面与截图自动恢复。
  • 卸载重装实测:卸载后面板与边距全清、路由 404;装回后单实例、串流与截图恢复。
  • 限制:Windows 盘符路径只做源码级验证(本机无 Windows);静态画面下录屏帧稀疏,前后帧可能晚于操作数秒,帧时刻与不确定度会如实标注;会话时钟不可用时日志切片不对齐,帧仍按分段时钟校准。
  • 调试分析的抽帧依赖宿主的 ffmpeg/ffprobe,缺失时会直接点名缺哪个,不会静默返回空帧。

常见问题

  • DSH 里怎么让 agent 操作安卓手机? 装本插件,让 agent 调 android_pane_attach 认领设备,然后它用点按/控件树/输入工具操作,每步自动回截图。
  • 怎么把截图/录屏保存到电脑? 点面板上的「截图」「录屏」,产物落到统一目录;路径条随时可见,设置里可换目录。
  • 调试能留下什么证据? 分段 MP4、全量 logcat、操作时间线,外加 analyze 生成的逐动作前后帧与日志切片。
  • 画面全黑怎么办? 多半是 FLAG_SECURE 页面,面板会出横幅并给出可点按的控件树;普通页面黑屏先确认 adb devices 在线。
  • 点按没反应? 部分厂商深度定制系统需要打开「USB 调试(安全设置)」,否则面板会降为只看。
  • 需要 root 吗? 不需要,插件也不会自动 root;受保护页面在无 root 时按系统限制降级。

工作原理

attach 时把 scrcpy-server 推上设备、以 app_process 跑 H.264 编码,视频流经 adb 端口转发到本机回环,网页端用 WebCodecs 硬解渲染;注入指令经 adb 下发,控件树来自 uiautomator dump。调试模式由 host 托管:分段录屏 + 全量 logcat + 结构化动作时间线,并在分析时按设备时钟与录屏内嵌帧时间把每一帧映射回真实时刻。

本地构建

git clone https://github.com/hoyyang/dsh-android-pane && cd dsh-android-pane
npm install && npm run build
npm test

卸载

dsh plugin remove dsh-android-pane

卸载即停流、回收 adb 子进程;状态在 <DSH_HOME>/dsh-android-pane/,可整目录删除。

隐私

agent 对设备的截屏会发送给所配置的模型。勿在受控设备上登录真实账号。

许可证

MIT — 见 LICENSE。随包分发的 scrcpy-server(Apache-2.0)与 ADBKeyboard.apk(Apache-2.0)见 THIRD_PARTY_NOTICES.md。

截图

停靠面板

统一保存目录

浮窗形态

窄窗自适应

录屏中

关闭前确认

Plugins associés