dsh-android-phone

dsh-android-phone

把安卓真机搬进 DeepSeek Harness 的侧栏

中文 · English

## 能力 - 手机画面**实时显示在 DSH 原生右侧栏**里;同一套能力也交给模型,AI 可操作手机 - **亚毫秒控制**:支持点按、长按、拖拽、滚轮、双指缩放、PC 键盘直通 - 支持**截屏 / 长截图** - 同一套能力作为工具交给模型 ——「AI 自动操作手机」和「用户手机画面展示」共用**同一条链路、同一个会话** - (尚在构思中)agent 自动操作手机,打通 IM-PC-PHONE 工作流 ## 环境要求 | 需要 | 说明 | | ------------- | ----------------------------------------------------------------------------------------- | | Windows 10/11 | 当前仅支持windows | | DSH | desktop profile,`>= 0.2.0-rc.2` | | Node | ≥ 20(插件运行时零 npm 依赖:adb 走命令行,PNG 编解码用自带 `src/core/png.js`) | | 安卓手机 | 「开发者选项 → USB 调试」打开,插 USB,弹窗点「一律允许」; USB 模式任选 | | 不需要 | `dsh-better-sidebar` —— 侧栏面板是 DSH 原生右侧栏功能,与它无关,也不需要安装它 | ## 安装 用 DSH 官方的安装入口,不需要跑脚本: 1. DSH → **设置 → 插件 → 添加插件** 2. 填**本地绝对路径**(插件目录,例如 `C:\Tools\dsh-android-phone`);仓库 public 之后也可以填 Git 地址 3. 安装(DSH 用自带 pnpm 完成依赖与注册) 4. **重启 DSH** 装完插件会出现在 DSH 的「插件」页(可在这里开关与配置);右侧栏里也会多出「📱 手机」页签 —— 打开方式是 **DSH 右侧栏自己的开关按钮 → 引导胶囊里选「📱 手机」**。 > 目前**没有发布到 npm**,所以「填包名」那条路暂时走不通 —— 用本地路径或 Git 地址。 > 安装细节与卸载见 [使用说明 · 安装与卸载](docs/usage.md#安装与卸载)。 ### 让 agent 帮你装 把插件目录的绝对路径给模型,附一句: > 装上 DSH 插件 `dsh-android-phone`(目录 `<绝对路径>`):跑 `dsh plugin --profile <我的 profile> add "link:<绝对路径>"` > (`dsh` 不在 PATH 时用 `\resources\runtime\cli\bin\dsh.cmd`),装完跑 `node scripts/doctor.mjs` 要 10/10 全绿,再重启 DSH。 > 不要改仓库里的代码。 ## 工作原理 ``` ┌─ DSH 宿主进程(Node) ─────────────────┐ │ session.js 单会话管理 / 自愈 / 控制权 │ ┌─ 手机 ─┐ │ video.js adb reverse + 帧解析 │ ───► │scrcpy- │ │ control.js 控制消息编码 │ ◄─── │server │ │ longshot.js 逐帧拼接 │ └────────┘ │ index.js 12 工具 + 19 HTTP 路由 │ └───────────────┬────────────────────────┘ │ HTTP(视频流 + 控制) ┌───────────────▼────────────────────────┐ │ DSH 侧栏(浏览器) │ │ client.js WebCodecs 解码 → canvas 上屏 │ └────────────────────────────────────────┘ ``` ## 文档 | 文档 | 内容 | |---|---| | [使用说明](docs/usage.md) | 安装与卸载细节、侧栏手势、清晰度、设置页、打开 App、会话与控制权 | | [工具与接口](docs/tools.md) | 12 个 `phone_*` 工具、动作语义、19 个 HTTP 接口 | | [工作原理](docs/protocol.md) | 三条链路、坐标空间、五条关键设计、性能数字 | | [排障](docs/troubleshooting.md) | 自检、adb 查找顺序、常见问题、清残留 | ## 开发 开发约定(硬约定、常见陷阱、改完要检查什么)集中在 **[AGENTS.md](AGENTS.md)**;协作流程见 **[CONTRIBUTING.md](CONTRIBUTING.md)**。 ## 已知限制 - 仅 Windows - 中文输入走控制通道直接送 UTF-8(≤300 字节自动分段);只有 adb 兜底路径只支持 ASCII - 静止画面出帧率低(5~6fps):scrcpy 虚拟显示只在内容变化时出帧,属正常现象 - 长截图对无限流 / 懒加载 / 倒计时页面可能有少量错位 - 部分机型 `input swipe` 会触发系统手势(控制通道路径不受影响) ## 免责声明 - 若你认为本仓库某处内容侵犯了你的权利,请在本仓库开 Issue 说明,核实后我会**立即删除或替换**相应内容。 ## 参与贡献 欢迎 Issue 与 PR。提 PR 前请跑一遍 `npm run ci`,并按 PR 模板填写测试情况(UI 改动附截图、协议层改动注明依据)。详细流程与代码约定见 [CONTRIBUTING.md](CONTRIBUTING.md)。 本项目未使用 CLA:按 Apache-2.0 提交 PR 即视为同意以同一许可证授权你的贡献。 ## 许可与致谢 本项目代码以 **Apache License 2.0** 授权,全文见 [LICENSE](LICENSE),第三方组件声明见 [NOTICE](NOTICE)。 - [scrcpy](https://github.com/Genymobile/scrcpy)(Apache-2.0)—— `vendor/scrcpy-server` 原样分发;视频流协议与控制通道依据其公开源码独立实现 - [QtScrcpy](https://github.com/barry-ran/QtScrcpy)(Apache-2.0)—— 产品交互形态参考,未复制其代码 - [Android SDK Platform-Tools](https://developer.android.com/tools/releases/platform-tools)(Google)—— `vendor/platform-tools/` 原样分发,仅作运行依赖 - 长截图拼接思路参考 [SnowShot](https://github.com/mg-chao/snow-apps)(逐帧采集 + 运动估计 + 增量拼接 + 置信度拒帧),纯 JS 实现,不依赖 OpenCV