—

解读:PhoneDriver——用 Qwen3-VL「看屏」+ ADB 驱动安卓手机

  • #PhoneDriver
  • #Qwen3-VL
  • #Android
  • #ADB
  • #Agent
  • #开源
  • #解读

本文是对开源项目 PhoneDriver 的摘要与评论。抓取时仓库约 ★1640、forks≈268;语言 Python,许可证 Apache-2.0;创建于约 2025-10(尚无 GitHub Release)。插图来自仓库 Images/PhoneDriver.png;安装与配置以仓库 README 为准。

使用边界:项目通过 ADB + 开发者模式 / USB 调试 控制手机。请只在你有权操作的设备上使用(自有机、明确授权的测试机),不要把它当成未授权监控或远程控制别人手机的手段。下文谈架构与工程取舍,不是攻击教程。

这篇在说什么

PhoneDriver 用一句话概括:用 Qwen3-VL 视觉语言模型「看」安卓屏幕,再用自然语言下任务,循环执行 ADB 动作(点击、滑动、输入等),直到完成或达到最大轮数。 它带 Gradio Web UI(默认 localhost:7860)和 CLI(phone_agent.py "…"),分析与推理都在本机跑。

和「写死坐标的 UIAutomator 脚本」比,卖点是屏幕像素 → 模型理解 → 动作。换 App 或改布局时,不必先维护一大套控件选择器;你用中文或英文描述目标,例如「打开相机」「在设置里打开 Wi‑Fi」,由模型根据当前截图决定点哪里。

先记住一句:视觉模型当眼睛,ADB 当手;这是本机实验路线,不是云端手机 Agent SaaS。 下面分别看问题、安装、工作环,以及它和云端方案差在哪。

PhoneDriver 演示图

它解决什么问题

手机 GUI 自动化长期卡在「脆弱选择器」上:版本一更新,资源 id 变了,脚本就碎。视觉方案换了一条路——不假设你能稳定拿到控件树,而是让模型像人一样看屏幕。代价是算力与不确定性:推理要吃显存,同一步也可能因弹窗、广告、暗色模式而走偏。

典型使用场景包括:在测试机上演示自然语言控机、探索「视觉 Agent 能不能完成多步设置流」、为自己写一些重复的本地操作原型。它还没有声称解决权限策略、多机调度或生产级失败恢复。星标量级也远小于 REA / yt-dlp 一类基础设施,但叙事清晰:读完就知道自己在买什么、不买什么。

怎么跑起来

依赖包括:Python 3.10+、本机 adb(Android Debug Bridge,安卓调试桥,用来从电脑向手机发调试命令)、已开 USB 调试的安卓机,以及够大的 GPU 显存。README 写在 24GB 卡上测过 Qwen3-VL-8B;默认导向 Dense 4B / 8B,也可改 MoE 变体(需改 import 与模型类)。

git clone https://github.com/OminousIndustries/PhoneDriver.git
cd PhoneDriver
python -m venv phonedriver && source phonedriver/bin/activate
# README:transformers 需装 git 源(撰写时 v4.57.0 尚未发版)
pip install git+https://github.com/huggingface/transformers
pip install pillow gradio qwen_vl_utils requests
adb devices   # 确认设备
python ui.py  # 或 python phone_agent.py "Open the camera app"

模型名在 qwen_vl_agent.py 里改(4B / 8B)。分辨率可在 Web UI Settings 自动探测,或写入 config.json,并用 adb shell wm size 核对。config.json 还有 temperature、step_delay、max_retries、Flash Attention 等旋钮:温度偏低更稳,动作间隔太短容易点在动画未完成的界面上。

解读:如果你显存不够,先换更小 Dense 模型、关其它占显存程序,再谈「换更大 MoE」。环境没稳定前,模型再强也只是系统地点飞。设备列表为空时,优先排查 USB 调试授权、数据线与 adb kill-server && adb start-server,而不是先怀疑模型。

工作环为什么关键

README 把循环写得很直:ADB 截屏 → Qwen3-VL 分析 UI → 规划动作(tap / swipe / type…)→ 下发 ADB → 重复,直到任务结束或达到 max cycles。闭环质量取决于两件事:模型是否「看懂控件」,以及坐标是否映射正确。分辨率配错会导致系统性点偏——所以 Settings 里的 auto-detect 不是装饰。

和传统脚本比,这种环更耐布局变化,但也更难做确定性回归。做实验时建议固定测试机、关掉无关通知,并把 max cycles 设上限,避免模型在失败界面上空转。实时截图与执行日志是调试的主要窗口:你要看的是「模型以为自己点了什么」,而不只是最终有没有碰巧成功。

和「云端手机 Agent」差在哪

市场上也有把手机控制接到云端大模型的产品形态:账号一开就能试,但截图与操作轨迹会离开本机。PhoneDriver 走另一端——模型与 ADB 都在你控制的机器上。好处是数据边界清晰,坏处是门槛前置:显卡、驱动、transformers 版本、USB 调试,任何一环不顺都会挡住「先跑起来再说」。

因此它更适合已经愿意折腾本地 AI 环境的人,而不是想要「打开网页就能远程控任意手机」的人。后者既不是本仓库目标,也往往踩到授权与隐私红线。若你的目标是稳定 CI 级 UI 测试,传统选择器方案与视觉方案可能要并存,而不是互相替代;PhoneDriver 更像「视觉闭环」的最小标本,而不是测试平台的完整替代品。

怎么看

PhoneDriver 把「手机 GUI Agent」缩成一个可复现的小仓库:Qwen3-VL + ADB + Gradio。适合做实验与演示;生产级还要补权限策略、失败恢复、多机调度,以及对系统 App 的安全边界。读完若只记住一句话,记住这句即可:先在自己的测试机上把眼睛和手接上,再谈要不要把它产品化。 完整参数与致谢见仓库。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。

完整能力表、参数默认值与最新变更仍以仓库 README 与 Release 说明为准;本文只做摘要与评论,不替代原文。