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- 在用户侧「我的工具」→「设备」Tab 点击「添加设备」,选择 Android,生成一次性配对码。
- Android 手机安装并打开控制 APK,填写服务器地址与配对码。地址可填域名(
https://host)或完整路径(https://host/mcp/device-control)。 - APK 完成登记并建立 WebSocket 长连接后,设备显示为在线状态。
- 把该设备实例授权给需要用手机的 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 超时 | 10s | WS 打开后 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)详解 →