让 Agent 操作手机

前三篇我们让 Agent 在浏览器里查资料,在桌面上按计算器,这一篇文章把手伸到手机上:打开一个应用、看一眼设置、记一条备忘。

工具也换了:这一篇的主角是 agent-android,一个照着 agent-browser 的样子做的安卓自动化命令行工具,Apache-2.0 协议,用 Python 写的。它读的是安卓的无障碍树,按编号点和输,循环还是同一套“看→动→再看”,变的只是这一次手伸进了口袋里的那台设备。

先说一句比前三篇都重要的话:浏览器练错了关掉就行,桌面练错了可能改掉一个文件,手机练错了,可能发出一条消息、花掉一笔钱。 手机和电脑不一样,它一直登录着你的所有账号,一直连着网,一直能付款。所以这一篇的练习,只在备用安卓机或安卓模拟器上做,只碰练习用的应用,主力手机上的账号、聊天和支付,一步都不练。

一、手机和桌面,差在哪一步

手机不是一台小电脑,它有三点不一样:

  • 手机一直登录着。 浏览器那篇特意用了和主力分开的浏览器,桌面那篇也让你用备用机;手机恰恰反过来,你每天用的那台就是登录了微信、支付宝、银行的那台。Agent 一接手,等于拿到了你的全部身份。
  • 手机的操作没有“关掉就行”。 浏览器里点错了,关标签页就收场;手机上发出去的消息、转出去的钱、删掉的照片,收不回来。
  • 手机的界面更依赖手势。 桌面上有鼠标键盘,手机上只有点、滑、长按。Agent 在手机上除了按编号点,还要会滑屏幕、按返回键,这些动作在浏览器和桌面上都不常用。

所以手机这一篇的规矩比桌面更严:动手之前先看清,动手之后再确认,凡是会对外产生效果的步骤,先停下来问人。 这一条不是建议,是底线。

还有一点要先说清楚:这一篇只讲安卓。 真 iPhone 没有 ADB 这样的命令行入口,Agent 没法像操作安卓那样直接操作你口袋里的 iPhone。苹果一侧唯一能走通的是 iOS 模拟器里的 Mobile Safari,agent-browser 的官方说明里确认支持这一项,但那是模拟器,不是真机。所以本篇的练习,用安卓模拟器或一台备用安卓机。

二、路怎么走:ADB 加无障碍树

手机这一篇走的还是无障碍树那条路,只是中间多了一个传话的人:

  • ADB 是电脑和手机之间的线。 ADB 的全名是 Android Debug Bridge,安卓官方的调试桥,电脑上的命令通过它传到手机上执行,手机上的屏幕信息也通过它传回来。装一次,就能连同一台电脑上的所有安卓设备。
  • 无障碍树还是那棵树。 安卓系统里同样有一份给读屏软件准备的界面清单,uiautomator dump 能把它导出来,里面写着每个按钮、输入框是什么、在屏幕的哪个位置。agent-android 读的就是这份清单。
  • agent-android 是照着 agent-browser 做的。 同样是快照加编号:先跑 snapshot -i 看当前屏幕上能互动的元素,每个元素带一个 @e1 这样的编号;再用 tap @e1 按编号点,用 input 往框里输字。Agent 不用猜坐标,系统直接告诉它按钮是谁。

这条路的好处和前面两篇一样:点得准、还省 token。坏处也一样:看不见无障碍树的应用,它就操作不了,有些自绘界面的应用、有些加了防截屏的应用,只能换别的办法,或者干脆别用 Agent 操作它。

agent-android 本身不是 Agent,也没有内置模型,只是一双“手”,脑子还是你用的那个编程助手,Claude Code、Codex、Cursor 这些都能直接调它。它也不是 Vercel Labs 出的,是第三方作者照着 agent-browser 的设计思路做的开源工具,装之前先看一眼它的说明和更新时间,确认它还在维护。

三、装好它:三步,加一个开关

装手机这一篇的东西比前两篇多一步:装完工具,还要在手机上开一个开发者开关。

  1. 先在电脑上装 ADB。 macOS 上运行 brew install android-platform-tools,这一步是装 ADB 本身。装完运行 adb devices,能看到命令正常工作就说明装好了。
  2. 再装 agent-android。 在终端里运行 pip install agent-android,装完运行 agent-android --version,能看到版本号就说明装好了。装完如果出问题,先看报错是哪一种:提示 command not found,是命令所在的目录不在 PATH 里,把它加进去(macOS 上一般是 ~/Library/Python/3.x/bin,x 是你的 Python 版本),写进 ~/.zshrc 以后就不用每次都加;报 ModuleNotFoundError: No module named 'core.ai_client',是这次装得不完整,先跑 pip install --force-reinstall agent-android 重装一次,还不行就从源码装(git clone https://github.com/Fast2x/agent-android.git,再 pip install -r requirements.txt)。
  3. 在手机上开 USB 调试。 打开手机的设置,找到“关于手机”,连续点七下“版本号”,打开开发者选项;再进开发者选项,打开“USB 调试”。用数据线把手机连到电脑上,手机上会弹出一个授权窗口,问你是否允许这台电脑调试,点允许。这一步是你亲手在手机上点的,Agent 自己开不了这个开关,也别让任何工具替你绕过它。

装完先别急着干活,先确认电脑真的连上了手机。运行 adb devices,列表里出现你的手机序列号、状态是 device,就说明连上了;再运行 agent-android connect,连上之后跑 agent-android snapshot -i,能看到一串当前屏幕上的元素,就说明整条路都通了。如果列表是空的,先看数据线是不是只充电不传数据、USB 调试是不是真的开了,不要跳过报错直接往下走。

练手优先用安卓模拟器:电脑上装一个安卓模拟器,同样跑 adb devices 就能连上,练错了删掉模拟器重建一个就行,连备用机都不用准备。

四、核心循环:看→动→再看,手机版

手机上的循环和前面两篇是同一套,只是命令换了,多了手势:

  1. 看快照。 agent-android snapshot -i,读当前屏幕的无障碍树,只列出能互动的元素,每个元素带一个编号。先对上号再动手。
  2. 按编号动手。 agent-android tap @e1,点快照里的 1 号元素;往框里输字用 agent-android input "要输的文字";滑屏幕用 agent-android swipe 100,200 300,400,从一个点滑到另一个点;按返回键用 agent-android press back,回主屏幕用 agent-android press home。动手只认编号,不认坐标。
  3. 再看一次。 动完之后再跑一次 agent-android snapshot -i,确认刚才那一下真的生效了。没有这一步,你就不知道 Agent 是办成了还是点错了。

记住这条铁律,和前面三篇一字不差:每次动手之前,先看快照;每次动手之后,再看一次。

手机版多出两条要刻进脑子里的规矩:

  • 先开应用,再拍快照。 手机上一次只显示一个应用,快照拍的是当前这个应用。想操作哪个应用,先用 agent-android start_app 包名 把它打开,或者在主屏幕的快照里找到它的图标点进去,再跑快照。包名每个应用都不一样,练手之前先在手机上查清楚你要练的那个应用的包名,别猜。
  • 中文输入完,先看快照确认。 input 输英文一般没问题,输中文时不同输入法、不同应用的表现不一样。输完先跑一次快照,看框里的字是不是你想输的那几个字,错了就重输,别急着点下一步。

五、三件真活,都走同一套循环

打开计算器算题、看一眼设置、记一条备忘,看起来是三件不同的事,在 agent-android 这里其实是同一个循环换了三次内容:

  1. 打开计算器算一道题。 先跑快照找到计算器图标的编号,点进去,再跑快照找到数字键和加号、等号的编号,按顺序点下去:点 7、点加号、点 8、点等号。每点一下都可以再跑一次快照确认,最后一次快照里读显示区域的值,确认答案真的是 15。这是最适合练手的第一件活:算错了没有任何后果,答案一眼就能验证。
  2. 在设置里确认 Wi-Fi 的开关状态。 打开设置,先跑快照找到 Wi-Fi 那一项的编号,点进去,再跑快照读 Wi-Fi 开关当前是开还是关。这一件活只读不改,练的是“看快照、读状态、再确认”,连改都不用改,适合第一次上手。
  3. 在备忘录里记一条练习笔记。 打开备忘录,先跑快照找到新建笔记的编号,点进去,再跑快照找到输入框的编号,用 input 输一句话,输完跑快照确认字写进去了,最后把这条笔记删掉。重点是全程只碰这一条练习笔记,写完删掉,不留尾巴。

三件事的共同点是:动手之前有快照,动手之后有验证,验证不对就停下来,而不是接着往下走。 手机上的 Agent 最容易出的错,和前面两篇一样,就是第一步错了,后面每一步都照着错的结果继续跑。

收发消息不在这一篇的练习里。打开聊天应用、读到对话列表、看到未读数,这一步可以练;点进对话、输字、点发送,这三步不练。 发出去的消息收不回来,练习没有“撤回了事”这一说。

六、卡住怎么办:三种常见情况

第一次练手机,十有八九会在这三种地方卡住,都是正常的:

  • 电脑找不到手机,adb devices 列表是空的。 先看数据线:很多线只能充电,不能传数据,换一根能传数据的线。再看手机:USB 调试是不是真的开了,授权窗口是不是点了允许。模拟器连不上,先看模拟器是不是真的在运行。
  • 快照是空的,什么元素都没有。 先确认当前在哪个应用:手机一次只显示一个应用,快照拍的是最前面的那一个。如果应用本身不提供无障碍树,那就换一个应用练,别硬来。
  • 点下去了,屏幕没反应。 先跑一次新的快照,看界面是不是变了:有时候点是点上了,只是界面还没刷新;有时候编号已经过期,点到了别处。解决办法只有一个:重新跑一次快照,用最新的编号动手。 不要图省事复用旧编号,也不要把没反应当成“再点一次就能好”。

这三种情况的共同解法,都是“停下来,重新看一次”,而不是“再试一次旧命令”。重新看一次的成本很低,点错一次的成本可能很高,手机上尤其如此。

七、安全提示:手机上的规矩最严

前面三篇的规矩,到了手机上全部适用,再加四条手机独有的:

  1. 只在备用机或模拟器上练。 没有备用安卓机,就用模拟器。手机 Agent 的手能碰到你的全部账号,练熟之前不要让它碰你的主力手机。
  2. 登录、付款、发消息、删东西,永远人来做。 这一篇只练计算器、看设置、记练习笔记。遇到这四类步骤,停下来,自己输密码、自己点确认,不要让 Agent 代劳。
  3. 练完就断开。 跑完 agent-android disconnect,把手机从电脑上拔下来,不用的时候把 USB 调试关掉。不要让一台能替你点手机的电脑,一直连着你的手机。
  4. 快照和截图里可能有你的隐私。 快照、截图里都可能带有手机上的私人内容,不要把这些东西贴进公开的日志和上传记录里。 练手用的快照,看完就删,别随手发出去。

这四条和第一篇的底线是同一套,只是落到了手机上。下一篇多应用串联,规矩只会更严,不会更松。

练一次:让 Agent 帮你打开计算器算一道题

不用准备什么,十五分钟就够,全程只碰计算器这一个应用:

  1. 先在电脑上装好 ADB 和 agent-android,再连上备用安卓机或模拟器,运行 adb devices 确认手机连上了。
  2. 跑 agent-android snapshot -i,在快照里找到计算器图标的编号,点进去,再跑一次快照,找到数字 7、加号、数字 8、等号这四个元素的编号。
  3. 按顺序点下去:点 7、点加号、点 8、点等号,每点一下都可以再跑一次快照确认。最后一次快照里读显示区域的值,确认答案真的是 15。
  4. 走完之后问自己三个问题:每一步动手前,我看了快照吗?动手后,我确认结果了吗?中间有没有哪一步是我凭猜测点的?最后运行 agent-android disconnect,把手机断开。练完就断,不要让一台能替你点手机的电脑一直连着。

走完这四步,手机这一步就算练成了。下一篇文章,我们把前面四篇的手连起来:让 Agent 跨应用办事,浏览器里查到的东西,桌面上整理好,手机上再看一眼。