Android 控制

Android 手机安装平台控制 APK 后直接接入 MCP——不依赖 ADB、不需要 USB 调试。Agent 可读取屏幕树/截图,下发点击、输入、滚动、打开应用等命令。

问题传统 ADB 自动化Ai Lubricant Android 控制
接入方式开 USB 调试、连 ADB、电脑常驻手机安装控制 APK,App 主动联网接平台;不依赖 ADB
远程控制ADB 端口/USB 线限制,NAT 后难用WebSocket 长连接,手机只需能出网
连接保活半开连接锁死,要自己处理新连接踢旧(last-writer-wins),半开不锁死
凭据管理凭据落在脚本/设备里设备 token 只存 sha256,吊销即断(close 4003)
命令覆盖自己封装每条指令15 个标准操控命令 + 屏幕树读取

功能:Android 控制 APK(非 ADB)

Android 控制 APK(非 ADB)
截图待补
把截图放到该路径,或把 src 改成实际图片地址
assets/screenshots/cap-android-control/android-apk.png
能力行为
安装方式把平台提供的控制 APK 安装到 Android 手机;不要求电脑安装 adb,不要求 USB 调试
连接方式APK 主动连接 /mcp/device-control/ws/device;蜂窝/WiFi 切换后自动重连
设备识别APK 注册 device_id、平台、系统版本、机型、屏幕与 capabilities;Agent 只操作被授权的 device_id
吊销前端解除设备后活连接立即 close 4003,APK 擦除凭据并停止重连

接入步骤

接入步骤
截图待补
把截图放到该路径,或把 src 改成实际图片地址
assets/screenshots/cap-android-control/connect.png
  1. 在用户侧「我的工具」→「设备」Tab 点击「添加设备」,选择 Android,生成一次性配对码。
  2. Android 手机安装并打开控制 APK,填写服务器地址与配对码。地址可填域名(https://host)或完整路径(https://host/mcp/device-control)。
  3. APK 完成登记并建立 WebSocket 长连接后,设备显示为在线状态。
  4. 把该设备实例授权给需要用手机的 Agent,Agent 通过授权的 MCP token 获得 device_id 并调用控制命令。
设备连接凭据 ≠ MCP 访问 tokenAPK 用设备凭据连 WebSocket;Agent 调用 MCP 用独立的 MCP token。二者不能混用,设备凭据只存 sha256。

功能:15 个操控命令

命令行为
get_screen_state读取屏幕树/当前状态(只读,可并发)
tap / long_press / double_tap点击 / 长按 / 双击坐标或节点
swipe / scroll / scroll_to_node滑动 / 滚动 / 滚到指定节点
type_text / set_text输入文本 / 直接设置输入框文本
press_key按键:enter/tab/delete/backspace/escape/space/dpad_*
dismiss_keyboard收起键盘
press_back / press_home / press_recents系统返回 / 主页 / 最近任务键
open_app / list_apps打开应用 / 列出已安装应用(list_apps 只读可并发)
串行与并发会改 UI 状态的命令按顺序串行执行;get_screen_state 与 list_apps 是只读例外,可并发。v0 故意排除音量/电源键。

功能:WebSocket v0 协议

设备打开 WS 到 /mcp/device-control/ws/device,握手双方带 protocol_version,服务端权威——不匹配直接 close 4004。

方向帧
设备 → 服务端register(登记设备与 capabilities)、heartbeat、call-response(命令结果)、event(capabilities-changed / control-revoked)
服务端 → 设备registered(ack 与协商参数)、call(下发命令)、call-cancel(建议性取消,设备仍须回 call-response)

关键常量

常量值含义
心跳间隔 / 超时15s / 60s任意帧都刷新活性,超时收割(close 4010)
单设备在途上限8第 9 条提前挡掉,设备会回 overloaded
call 超时默认 15s / 上限 60s设备侧可 clamp 到 60s,服务端预算 = timeout + 5s
最大帧4 MiB超过 close 4002
register 超时10sWS 打开后 10s 内必须发 register,否则 close 4008

机制:新连接踢旧

Android 半开连接频繁(doze、蜂窝/WiFi 切换、进程被回收都不发 TCP FIN)。协议用新连接踢旧(旧连接 close 4009)而不是拒绝式,避免"服务端以为还连着、设备怎么都连不上"。吊销即断:用户删除/轮换设备凭据后活连接必须当场断(close 4003),不等心跳超时。

机制:屏幕树格式

get_screen_state 返回紧凑 TSV 格式的 UI 树(CompactTreeFormatter):

  • 每行一个节点:node_id\tdepth\ttype\ttext\thint\tstate\tbounds
  • 坐标为物理像素(整数),与 tap 等命令直接对应
  • 包含可见性、可点击性、输入框状态等属性
  • 支持游标分页(节点数过多时分批读取)
与节点的区别「节点」(cap-node) 主动连 NodeConnect、TOTP 鉴权、跑 CLI/终端/代理;「Android 控制」(本页) 由 Android 控制 APK 主动连 device-control WS,读屏并下发操控命令。协议、鉴权、用途都不同,是两套独立栈。

iOS 控制详解 → · device token / MCP token 隔离治理 → · 浏览器控制(CDP)详解 →