ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Qwen-UI-Agent 到底神在哪里?从 ADB 一条命令看懂手机 GUI Agent 的底层原理

Qwen-UI-Agent 到底神在哪里?从 ADB 一条命令看懂手机 GUI Agent 的底层原理 1. 先别急着谈模型一条 ADB 命令就能让电脑“摸到”手机Qwen-UI-Agent 是什么一句话说它是把多模态大模型接到真实手机屏幕上的 GUI Agent 框架能看懂界面、决定下一步、再通过执行层把动作打到 Android 上。它适合谁适合想搞明白手机 GUI Agent 底层链路、又不想被“AI 黑科技”四个字唬住的开发者。很多人第一次看它自动开 App、点按钮、滑列表会觉得模型直接“钻进”了手机。其实不是。真正把手指动作落到屏幕上的是 ADB 这条老链路。我拿一台 Android 真机做实验USB 连电脑打开开发者模式和 USB 调试然后只敲一条adb devices返回List of devices attached R5CXC38N7RA device到这一步电脑已经能对手机发指令了跟大模型一点关系都没有。接着试点击adb shell input tap 540 1170我的测试机分辨率是 1080×2340所以 (540,1170) 基本就是屏幕中心。ADB 不关心那里是按钮还是空白它只认坐标。滑动也一样adb shell input swipe 540 1800 540 600 500意思是手指从 (540,1800) 滑到 (540,600)耗时 500ms。你会发现“电脑能自动点手机”本身不是 AIAndroid 早就提供了这套自动化能力。真正缺的是ADB 不知道应该点哪里。它只认识 (x,y)不认识“搜索框”“登录按钮”“购物车”。这个“该点哪”的问题才是 Qwen-UI-Agent 这类 GUI Agent 要解决的。2. TaoToken 前置给 Agent 一条统一的模型调用通道Qwen-UI-Agent 的循环里最吃调用量的是模型侧截图要送进视觉模型做 GUI Grounding任务状态要送进大模型做 Planning。如果你本地同时接好几个模型供应商Key 管理、Base URL 切换、额度查看会很快变成负担。我的做法是先用 TaoToken 把模型通道统一起来再让 Agent 只认一个入口。TaoToken 在这里扮演的是统一 Key / API 通道官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 这个不加 UTM。你可以在控制台里建 Key、看额度、切换要用的模型然后把它写进 Agent 的配置里。这样后面调 Qwen-UI-Agent 时模型侧只改一个 base_url 和 api_key不用在代码里到处塞不同厂商的地址。需要先拿 Key 的话走这条https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。想先在网页里验证模型通不通用模型对话页https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。如果你打算长期跑编码类或 Agent 类任务Coding Plan 页更合适https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。接入细节和参数说明看文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。注意TaoToken 是模型调用通道不是“绕过手机系统”的接口。手机侧的动作仍然由 ADB 或等价执行层完成两者职责别混。3. 可复制配置settings.json 与 config.toml 骨架下面给两份可直接改的配置骨架。第一份是给类 Claude Code / CLI Agent 风格工具用的settings.json把模型请求指向 TaoToken第二份是给 Python 侧 Agent 用的config.toml同时管模型通道和 ADB 参数。settings.json{ model_provider: { name: taotoken, base_url: https://taotoken.net/api, api_key: sk-你的TaoTokenKey, default_model: qwen-vl-max, timeout_seconds: 120 }, agent: { max_steps: 60, screenshot_dir: ./shots, action_delay_ms: 800, retry_on_parse_error: 2 } }config.toml[model] base_url https://taotoken.net/api api_key sk-你的TaoTokenKey vision_model qwen-vl-max plan_model qwen-max temperature 0.1 [adb] serial R5CXC38N7RA screenshot_cmd adb exec-out screencap -p tap_cmd adb shell input tap {x} {y} swipe_cmd adb shell input swipe {x1} {y1} {x2} {y2} {duration} text_cmd adb shell input text {content} back_cmd adb shell input keyevent 4 home_cmd adb shell input keyevent 3 [loop] max_steps 60 action_delay_ms 800 save_every_step true几个参数值得单独说。temperature压到 0.1 附近是因为 GUI 动作需要稳定复现太发散会导致同一屏给出不同坐标。action_delay_ms是给界面动画留时间点完立刻截图经常截到过渡态。max_steps是长任务的安全阀防止模型在某个页面反复横跳。serial在多设备时必填单设备可以留空让 ADB 自己选。如果你用的是 Claude Code 风格的 CLI 环境接入地址同样走 TaoToken 的 Anthropic 兼容入口参考https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 。配置思路一致base_url 指向 TaoTokenKey 用控制台生成的模型名按文档里支持的填。4. 验证请求从截图到动作注入的完整闭环配置写完先别急着跑长任务用最小闭环验证一遍。第一步确认截图能落到本地adb exec-out screencap -p phone.png打开phone.png如果能看到当前手机画面说明“观察”通道通了。第二步确认控件树能读出来adb shell uiautomator dump /sdcard/ui.xml adb pull /sdcard/ui.xml ./ui.xmlui.xml里每个节点带bounds[x1,y1][x2,y2]这就是传统控件树解析的坐标来源。视觉模型做 GUI Grounding 时这份 XML 可以作为交叉校验模型给的中心点如果落在某个节点的 bounds 内可信度就高落在空白区就要重新推理。第三步把截图和任务描述发给模型让它输出结构化动作。请求体大致这样{ model: qwen-vl-max, messages: [ { role: user, content: [ {type: text, text: 任务打开设置。当前屏幕如下请输出下一步动作格式为 JSON{\action\:\tap\,\x\:0,\y\:0,\reason\:\\}}, {type: image_url, image_url: {url: data:image/png;base64,你的base64}} ] } ] }模型返回类似{action: tap, x: 650, y: 820, reason: 设置图标位于桌面第二行}第四步把动作翻译成 ADB 并执行adb shell input tap 650 820执行完重新截图进入下一轮。整个循环就是截图 - 视觉理解 - GUI Grounding - Planning - Action - ADB 执行 - 新截图写成伪代码更直白while step max_steps: shot capture_screen() action call_model(tasktask, imageshot) if action[action] finished: break run_adb(action) step 1成功的结果是手机真的打开了设置页且下一轮截图里能看到设置界面。如果模型给的坐标点偏了你会看到点到了隔壁图标这时候别急着骂模型先检查截图是不是过渡态、坐标是不是没按分辨率缩放。5. 本篇常见错排查报错一adb devices显示unauthorized。手机屏幕上没点“允许 USB 调试”。拔插一次数据线重新弹窗时勾选“始终允许”。如果一直不弹去开发者选项里点“撤销 USB 调试授权”再重连。报错二adb: more than one device/emulator。你连了多台设备或开着模拟器。用adb devices看序列号然后在命令里加-s R5CXC38N7RA或者把config.toml里的serial填上。报错三截图是黑的或全白。部分 App 和系统页面禁止截屏screencap会拿到黑图。换一个普通桌面或设置页验证链路别拿支付页、密码页做首测。报错四模型返回的坐标点不到目标。先确认截图分辨率和wm size输出一致adb shell wm size如果模型按 1080×2340 给坐标但截图被压缩过就要按比例还原。另一个常见原因是action_delay_ms太小界面还没稳定就截图了把延迟调到 1000ms 以上再试。报错五input text输入中文失败。adb shell input text对中文支持不稳定空格和特殊字符也容易丢。稳妥做法是先用 ADB 唤起输入法或者把文本通过剪贴板注入再触发粘贴。英文和数字一般没问题。报错六模型请求 401 或 404。401 多半是 Key 没填对或没带Bearer404 多半是 base_url 写成了带路径的地址。TaoToken 的 API 基址是https://taotoken.net/api模型名按文档里支持的填别自己拼。报错七循环跑飞一直点同一个位置。说明模型没拿到“上一步做了什么”的上下文。把历史动作和最近两张截图一起塞进请求或者在 prompt 里明确写“如果连续两次动作相同请换策略或输出 finished”。6. 把链路跑通之后再谈 Qwen-UI-Agent 强在哪跑通上面这套最小闭环你会发现 GUI Agent 的骨架并不神秘眼睛是截图加视觉模型大脑是 LLM 加 Planning手是 GUI Action 加 ADB 执行层。Qwen-UI-Agent 真正难的地方是让这个循环在真实、动态、会弹广告、会改版、会掉登录的手机上稳定跑完长任务。它把 mobile、computer、browser 等场景统一到一个 Action Space还支持一次决策输出多个动作来压延迟这些才是工程含量所在。所以别把 GUI Agent 神化也别因为看懂了 ADB 就低估它。ADB 解决的是“怎么点”Agent 解决的是“看见什么、理解什么、为什么点、点完怎么办”。你本地复现时模型通道用 TaoToken 统一起来手机侧用 ADB 打通剩下的就是不断调 prompt、调延迟、调重试策略。等你能让它在自己手机上连续完成十步不跑偏再回头看 Qwen-UI-Agent 的论文和仓库很多设计选择会一下子变得顺理成章。
返回列表