🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

安卓实时面板 hoyyang/dsh-android-pane

DeepSeek Harness
hoyyang45 天前有提交已提供中文文档扫描:含敏感能力

在对话旁实时投屏安卓设备,让 agent 点按操作并截图验证

29.7/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/30 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add hoyyang/dsh-android-pane
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]!
实装验证未通过(dependency_conflict),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
数据截至 2026/09/30·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 45 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

⚠︎ 实装验证未通过(dependency_conflict · 2026/9/30) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件
查看扫描证据(共 74 处,展示前 58 条)
  • 执行外部命令来自配置/变量
    lib/index.js:45
    const child = execFile(this.adbPath, [...args], {
  • 执行外部命令来自配置/变量
    lib/index.js:122
    const child = execFile(this.adbPath, [...args], {
  • 读取本地文件
    lib/index.js:404
    const stream = createReadStream(registered.file, {
  • 读取本地文件
    lib/index.js:845
    if (!lstatSync(canonical).isDirectory()) throw new Error("目录不是文件夹:" + directory);
  • 写入本地文件
    lib/index.js:848
    writeFileSync(probe, "", {
  • 删除本地文件
    lib/index.js:854
    unlinkSync(probe);
  • 读取本地文件
    lib/index.js:870
    raw = JSON.parse(readFileSync(file, "utf8"));
  • 写入本地文件
    lib/index.js:893
    mkdirSync(dir, { recursive: true });
  • 读取本地文件
    lib/index.js:937
    const stat = lstatSync(file);
  • 写入本地文件
    lib/index.js:966
    writeFileSync(tmp, JSON.stringify(next, null, 2), {
  • 写入本地文件
    lib/index.js:970
    renameSync(tmp, this.file);
  • 删除本地文件
    lib/index.js:974
    unlinkSync(tmp);
  • 执行外部命令来自配置/变量
    lib/index.js:1154
    this.proc = spawn(this.adbPath, serverArgs, {
  • 执行外部命令来自配置/变量
    lib/index.js:1556
    spawn(this.adbPath, [
  • 执行外部命令来自配置/变量
    lib/index.js:1715
    const child = spawn(adbPath, [...args], {
  • 读取本地文件
    lib/index.js:1933
    if (!existsSync(tmp)) throw new Error("没有生成新的有效PNG");
  • 读取本地文件
    lib/index.js:1934
    const png = readFileSync(tmp);
  • 写入本地文件
    lib/index.js:1936
    renameSync(tmp, file);
  • 写入本地文件
    lib/index.js:2018
    mkdirSync(this.opts.shotsDir, { recursive: true });
  • 删除本地文件
    lib/index.js:3249
    unlinkSync(tmp);
  • 执行外部命令来自配置/变量
    lib/index.js:3322
    const proc = spawn(this.adb.path, [
  • 删除本地文件
    lib/index.js:3455
    unlinkSync(tmp);
  • 删除本地文件
    lib/index.js:3865
    unlinkSync(tmp);
  • 删除本地文件
    lib/index.js:3964
    rmSync(framesDir, {
  • 执行外部命令来自配置/变量
    lib/adb.js:36
    const child = execFile(this.adbPath, [...args], { timeout: timeoutMs, maxBuffer: 64 * 1024 * 1024, killSignal: 'SIGKILL', windowsHide: true }, (err, s
  • 执行外部命令来自配置/变量
    lib/adb.js:102
    const child = execFile(this.adbPath, [...args], { timeout: timeoutMs, maxBuffer: 64 * 1024 * 1024, killSignal: 'SIGKILL', encoding: 'buffer', windowsH
  • 读取本地文件
    lib/pane-service.js:27
    if (!existsSync(tmp))
  • 读取本地文件
    lib/pane-service.js:29
    const png = readFileSync(tmp);
  • 写入本地文件
    lib/pane-service.js:32
    renameSync(tmp, file);
  • 写入本地文件
    lib/pane-service.js:118
    mkdirSync(this.opts.shotsDir, { recursive: true });
  • 读取本地文件
    lib/pane-service.js:1105
    const stat = lstatSync(file);
  • 写入本地文件
    lib/pane-service.js:1129
    writeFileSync(tmp, png, { flag: 'wx', mode: 0o600 });
  • 写入本地文件
    lib/pane-service.js:1130
    renameSync(tmp, file);
  • 删除本地文件
    lib/pane-service.js:1137
    unlinkSync(tmp);
  • 执行外部命令来自配置/变量
    lib/pane-service.js:1220
    const proc = spawn(this.adb.path, ['-s', serial, 'shell', 'echo $$; exec ' + command], { stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true });
  • 读取本地文件
    lib/pane-service.js:1279
    const stat = lstatSync(tmp);
  • 写入本地文件
    lib/pane-service.js:1312
    renameSync(tmp, file);
  • 删除本地文件
    lib/pane-service.js:1317
    unlinkSync(tmp);
  • 读取本地文件
    lib/pane-service.js:1602
    const input = createReadStream(file, { encoding: 'utf8' });
  • 写入本地文件
    lib/pane-service.js:1667
    writeFileSync(tmp, JSON.stringify({ id: sess.id, serial, startedAt: sess.startedAt, stoppedAt: sess.stoppedAt, segments: sess.segments, actions: sess.
  • 删除本地文件
    lib/pane-service.js:1672
    unlinkSync(tmp);
  • 删除本地文件递归
    lib/pane-service.js:1761
    rmSync(framesDir, { recursive: true, force: true });
  • 读取本地文件
    lib/pane-service.js:1788
    const size = lstatSync(seg.local).size, fd = openSync(seg.local, 'r');
  • 删除本地文件
    lib/pane-service.js:1853
    unlinkSync(tmp);
  • 执行外部命令来自配置/变量
    lib/pane-service.js:1906
    const proc = spawn(bin, ['-avd', avd, '-no-snapshot-save', '-no-boot-anim'], { stdio: 'ignore', detached: true, windowsHide: true });
  • 读取本地文件
    lib/routes.js:179
    const stream = createReadStream(registered.file, { fd, autoClose: true, start, end });
  • 执行外部命令来自配置/变量
    lib/scrcpy-host.js:181
    this.proc = spawn(this.adbPath, serverArgs, { stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true });
  • 执行外部命令来自配置/变量
    lib/scrcpy-host.js:643
    spawn(this.adbPath, ['-s', this.serial, 'forward', '--remove', `tcp:${this.port}`], { stdio: 'ignore', windowsHide: true }).unref();
  • 执行外部命令来自配置/变量
    lib/scrcpy-host.js:809
    const child = spawn(adbPath, [...args], { stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true });
  • 读取本地文件
    lib/state.js:28
    if (!lstatSync(canonical).isDirectory())
  • 写入本地文件
    lib/state.js:32
    writeFileSync(probe, '', { flag: 'wx', mode: 0o600 });
  • 删除本地文件
    lib/state.js:36
    unlinkSync(probe);
  • 读取本地文件
    lib/state.js:53
    raw = JSON.parse(readFileSync(file, 'utf8'));
  • 写入本地文件
    lib/state.js:75
    mkdirSync(dir, { recursive: true });
  • 读取本地文件
    lib/state.js:111
    const stat = lstatSync(file);
  • 写入本地文件
    lib/state.js:125
    writeFileSync(tmp, JSON.stringify(next, null, 2), { flag: 'wx', mode: 0o600 });
  • 写入本地文件
    lib/state.js:126
    renameSync(tmp, this.file);
  • 删除本地文件
    lib/state.js:131
    unlinkSync(tmp);
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-tools@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 安卓设备实时投屏
  • 智能体点按操作
  • 截图验证

DeepSeek Harness 的 Android 真机面板:scrcpy H.264 串流、智能体注入、UI 树校验

README

由 DeepSeek 最新模型翻译生成
dsh-android-pane banner 在 DeepSeek Harness(DSH)对话旁打开一块 Android 实时画面面板:模拟器和 USB 真机通吃,agent 能点按操作并用截图 + 控件树自证改动,你也能随时上手共操作。 English · Releases · 更新日志 安装 dsh plugin add github:hoyyang/dsh-android-pane 零配置:不需要 API Key、不需要改 DSH 配置。需要 adb 在 PATH(Android SDK),一台开了 USB 调试的设备或任一模拟器;macOS/Linux + DSH web profile。 有啥用 - 实时画面:scrcpy-server H.264 直推 DSH 网页端,WebCodecs 硬解(本机回环 30–60fps);scrcpy 起不来(老设备/强化安全系统)自动降级截图轮播。 - agent 自己会验证:10 个上下文经济工具——点按/滑动/文本/按键/滚动/旋转(每次操作自动回截图)、uiautomator 控件树带点按坐标、mp4 录屏、host 托管调试会话(录屏 + logcat + 动作时间线)。
展开完整文档(README 剩余 1 节)
dsh-android-pane

banner

在 DeepSeek Harness(DSH)对话旁打开一块 Android 实时画面面板:模拟器和 USB 真机通吃,agent 能点按操作并用截图 + 控件树自证改动,你也能随时上手共操作。

English · Releases · 更新日志

安装

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

零配置:不需要 API Key、不需要改 DSH 配置。需要 adb 在 PATH(Android SDK),一台开了 USB 调试的设备或任一模拟器;macOS/Linux + DSH web profile。

有啥用

- 实时画面:scrcpy-server H.264 直推 DSH 网页端,WebCodecs 硬解(本机回环 30–60fps);scrcpy 起不来(老设备/强化安全系统)自动降级截图轮播。
- agent 自己会验证:10 个上下文经济工具——点按/滑动/文本/按键/滚动/旋转(每次操作自动回截图)、uiautomator 控件树带点按坐标、mp4 录屏、host 托管调试会话(录屏 + logcat + 动作时间线)。
- FLAG_SECURE 黑屏自愈:银行/密码类应用自动识别,横幅提示 + 缓解链(adb root → root 框架启用指引 → SECURE 位复查终局判定),仍被系统拦截时降级为可点按的控件树文本视图,每步结果明示,绝不静默。
- 人机共屏:面板里点=点按、拖=滑动;agent 操作时亮红色徽标(面板手势暂被拒绝),谁在开车一目了然。
- 会话隔离:一台设备同时只归一个会话;闲置 10 分钟自动释放(模拟器关机、真机仅断开)。
- 仅本机:所有流只允许 127.0.0.1 访问(其余一律 403),面板变更做同源校验。

30 秒上手

1. 手机开 USB 调试连电脑(或启动任一模拟器);
2. 对 agent 说「连接我的安卓设备」;
3. DSH 网页端出现设备实时画面;
4. 说「点一下设置图标」——围观 agent 操作,每步自动回截图;
5. 你也可以直接在画面上点按、拖动,人机共屏。

进阶用法

- 中文输入:android_pane_install_ime(一次性装 ADBKeyboard 输入法,中文经剪贴板粘贴)。
- 元素级操作:android_pane_ui 按 find/click/setText,文本模糊匹配控件,替代盲点坐标。
- 安全页面检测开关:config flagSecureCheck(默认 true)。
- 部分厂商深度定制系统:注入点击需打开「USB 调试(安全设置)」,否则面板自动降为只看。

工作原理

attach 时把 scrcpy-server 推上设备、以 app_process 跑 H.264 编码,视频流经 adb 端口转发到本机回环,网页端 WebCodecs 硬解渲染;注入指令经 adb 下发,控件树来自 uiautomator dump。debug 模式由 host 托管:分段 mp4 录屏 + 全量 logcat + 结构化动作时间线,供事后逐动作回放分析。

可靠性与验收

按 dsh-plugin-build 生产线交付:隔离 staging 验证、卸载重装幂等、冷启动三故障静态检测、十门审查;模拟器与多品牌真机实测(H.264 串流、注入、中文输入、FLAG_SECURE 降级链、多设备并发)。样式层自愈(v0.1.1):头部按钮/面板样式被意外移除或失效时毫秒级自动恢复,热重载后新样式免整页刷新即生效。

常见问题

- 画面全黑? 多为 FLAG_SECURE 页面(银行/密码管理器),面板会出横幅并给缓解链;普通页面黑屏先确认 adb devices 在线。
- 点按没反应? 部分厂商深度定制系统需开「USB 调试(安全设置)」。
- 帧率低? 多设备同时串流会分带宽,先 detach 不用的设备。

本地构建

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

卸载

dsh plugin remove @dsh-external/dsh-android-pane

卸载即停流、回收 adb 子进程;状态在 /dsh-android-pane/(截图、state.json),可整目录删除。

隐私

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

许可证

MIT — 见 LICENSE。随包分发的 scrcpy-server(Apache-2.0)与 ADBKeyboard.apk(Apache-2.0)见 THIRD_PARTY_NOTICES.md。
预览分享卡片长什么样 ↓hoyyang/dsh-android-pane
分享 · DeepSeek Harness Hub
hoyyang/dsh-android-pane

在对话旁实时投屏安卓设备,让 agent 点按操作并截图验证

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部