设备状态监控
实时展示所有设备状态、当前执行任务及进度
设备列表
· 每 5 秒自动刷新 · · 未选中
设备 型号 任务状态 前台App 进度 当前任务 当前动作 最近错误 操作
异常汇总
任务运行概况
任务
任务计划定时调度与自定义动作复用管理
ID任务名类型启用目标调度下次运行重试操作
把常用步骤打包成可复用的动作,拖入任务步骤编辑器使用;也可在任务编辑器里"☑选中步骤→打包"生成
图标动作名步骤数创建时间操作
🤖 AI 控制台
📺 实时画面
运行任务时自动跟随操作的设备;
也可手动选择设备观看
1️⃣ 说清楚要做什么
AI 会自己在设备上探索,把走通的路径写成任务步骤
2️⃣ 选一台空闲设备
有任务在跑的设备不可选(AI 不与任务抢设备)
3️⃣ 任务设置(可选,留空由 AI 判断) ▸
探索回放
AI 在设备上的每一步(看屏 / 读元素树 / 点按验证)会实时显示在这里。
日志查看
原始文本日志 + 任务步骤明细(结构化,可按设备/任务/时间过滤)
~
~
最近运行概览
开始设备任务 步骤数失败
时间设备任务 步骤标签类型 结果耗时详情
用户管理
管理后台登录用户
ID用户名管理员权限操作
工具
管理员专用:设备工具与应用管理集合
注入后需在目标 App 的输入框长按选择"粘贴"
实现:ClipInject APK 透明 Activity 写入剪贴板(Android 10+ 可用,u2 setClipboard 在 Android 12/13 会被系统丢弃);设备需先安装 com.example.clipinject,注入后自动读回比对验证。
点击"刷新设备"加载
选中目标设备后,命令里的 -s <设备> 自动附加,直接写 shell ls /sdcard 即可。离线设备也可选,用"重连设备"恢复。 禁止 kill-server / disconnect(会中断共享的 adb transport,导致设备连接全部重建)。
(执行命令后输出显示在这里)
主机名显示名IP系统在线授权密钥过期操作
点击"刷新设备"加载
"设置IP"可修改设备 IPv4(会断开当前连接,平台 serial 随之变化,需同步设备池);"密钥不过期"= 关闭设备密钥验证,设备不会被定期踢下线;auth key 生成后只显示一次,请立即复制。
应用名包名版本大小上传时间操作
📱 设备端应用商店(Agent 直连安装)
设备上装的 Agent 自己来拉这份应用清单 → 在手机上选一个 → 自己下载 → 自己调系统安装器安装。 因为安装由设备上的 App 发起,走的是普通应用安装流程, 不会触发 MIUI 针对 adb 安装的「USB 安装」拦截(那正是 adb install 报 USER_RESTRICTED 的原因)。 适合"人就在机器旁边"的场景(本来就要点一次安装确认)。平台批量推送仍用上面的「安装」按钮。
接口契约见 doc/DEVICE_AGENT.md;令牌属于凭据,别外传。
时间设备 应用动作说明
暂无记录(设备还没从商店装过东西)
设备 状态 版本号 versionCode
输入包名后点击"查询版本"
查询所有设备(本地 adb 含 USB + 设备池)上该包名的安装情况与版本号,用于对比各设备 App 版本是否一致;未连接的设备会自动连接(绝不断开,不影响任务)。
应用版本号versionCodeAPK 路径
选择设备后点击"查看应用"
周期 秒 · 网段
serial识别来源首次发现最近发现在线操作
尚未扫描
扫描局域网/Tailscale 网段中开放 adb 5555 的设备进入待连接池; 确认后才加入正式设备池(不自动连接、不参与任务调度)。未授权设备(手机未接受 RSA 弹窗)不会出现。
「识别」列:平台按设备指纹认出这台其实就是池中某台设备换了 IP —— 确认后自动认领: 迁移原记录(名称/型号/备注全保留),并把分组与任务里的旧地址一并换成新地址。新设备则必须填名称。
设备池断联设备 (仍在设备池内,扫描线程每轮自动重连;也可手动立即重连)
serial名称型号状态操作
全部在线
serial名称型号在线状态 指纹 添加时间操作
新增设备流程:手机开 USB 调试 → 连上后「adb 终端」执行 tcpip 5555 转网络调试 → Tailscale 上线(同一账号)→ 在此添加 IP:5555(自动尝试连接)→ 任务运行时 u2 自动推送 atx-agent。停用 = 不参与任务调度,删除 = 从池中移除(不影响其他系统)。
设备名称必填且唯一:它是设备在平台里的身份(分组/任务/日志都按名称认设备); 设备换了 IP 时用「换地址」把记录迁过去,分组与任务的引用会自动同步,不用重新配。
分组名描述设备数设备列表操作
管理设备分组,用于任务按分组执行。分组内的设备需先在设备池管理中确认(不在池内的设备不参与调度)。
系统
系统数据备份导出/导入(仅管理员)
导出当前系统数据为 zip:把数据库(MySQL 或回退模式的 SQLite)整库一致快照成 users.db 归档(全部业务表:用户 / 任务计划 / 设备分组 / 自定义动作 / APK 记录 / 设备池 / 待连接设备 / AI 会话 / 经验库 / 经验巡检 / 动作库 / 系统配置)+ 可选的 apks/ 应用文件。恢复用:换机 / 整库迁移 / 出问题前留底。
清单见预览的「表数据行数」(由模型元数据自动派生,新增表不会漏);备份里记录了来源环境,跨环境导入默认拒绝。
⚠️ 备份为全量快照:含用户口令哈希、AI 配置里的 API Key 等敏感信息,请妥善保管,勿外传、勿提交到 git。
导入恢复:上传平台导出的 .zip 或 .db → 先校验预览 → 确认后系统会自动备份当前库(data/backups/pre_restore_*.zip,可直接再导入回来)并把恢复任务挂起, 重启 web_server 后生效(导入将覆盖现有全部数据;数据替换在单个事务里完成,失败会自动回滚)。
备份来自另一个环境(dev↔prod)时默认拒绝导入,需在预览页显式勾选「允许跨环境导入」。
通知:把平台事件(任务失败/成功、设备上下线、安装完成、备份恢复…)推到 webhook, 例如企业微信群机器人。每条 webhook 自己勾选关心哪些事件——不勾就不推。
为防刷屏:同一条 webhook 默认每 30 秒合并一次同类事件、每分钟最多 18 条 (企业微信硬限 20),超出的会压成一条「被限流折叠」摘要而不是丢掉。详见 doc/NOTIFY.md。
默认聚合 秒 · 限流 条/分
名称格式URL订阅状态操作
发送记录 仅本次运行期间(重启清空);完整历史见 logs/notify.log
时间Webhook事件结果详情