最近很多团队开始做一件事:把 AI Agent 接到一台真实的手机上,让它像人一样打开 App、点按钮、填信息、下单、发消息。不是模拟器,不是纯接口调用,是实实在在握住一台手机操作。这件事在近两年突然火起来,原因很直接——模型能看懂屏幕了。过去移动端自动化只能靠控件定位和固定坐标,现在 Agent 可以直接“看”界面,但这不意味着简单。移动端自动化原本是测试工程师的主场,规则清晰、环境受控;AI Agent 一进场,把问题变成了“视觉理解 + 意图推理 + 动作控制 + 失败恢复”的综合工程。这篇文章不聊概念,直接拆移动端 Agent 操作真实手机时最值得关注的三个新考点:从控件依赖到像素级理解、长任务的状态恢复、异常处理与安全边界。
1. 为什么移动端自动化突然被Agent盯上了
1.1 传统自动化脚本的“玻璃天花板”
先看看以前怎么操作手机。主流做法靠控件树和坐标两种。控件树方案需要 App 暴露界面层级,测试框架通过选择器找按钮、输入框;坐标方案更加粗暴,记录“在这个分辨率下点击某个固定位置”。两者都有一个共同点:一旦界面重新布局、图片素材替换、分辨率变化,脚本就崩。App 版本更新后,测试工程师要花大量时间修定位符,这就是圈内常说的“自动化维护地狱”。
更麻烦的是,很多界面根本不给你控件树。比如某些用自绘引擎或游戏引擎开发的 App,整个屏幕在系统看来就是一张图,传统框架完全没辙。这种情况下测试只能靠 OCR 识别文字位置,再配合坐标点击,准确率全靠运气。
传统自动化的天花板在于:它只能执行“已经被定义好的操作”,不能理解“为什么操作”,更无法处理预期之外的情况。弹窗出现、网络延迟、推荐位变化,任何一点意外都会让脚本卡死。这也是为什么过去移动端自动化主要用于回归测试,很少用于复杂业务操作。
1.2 AI Agent带来的三个能力跃迁
AI Agent 进入移动端自动化后,情况发生了质变。第一是视觉理解能力,Agent 通过截图就能知道屏幕上有什么、按钮在哪、状态是什么,不需要控件树,也不需要预先录制坐标。第二是意图推理能力,你给它一句“帮我把购物车里最贵的商品删掉”,它能拆解成“打开购物车→识别商品列表→比较价格→找到最贵→执行删除”这样的多步计划,并且在执行中根据界面反馈调整。第三是容错能力,点击没反应、页面加载慢、弹窗出现,Agent 可以观察结果并重试,而不是像老脚本那样直接报错退出。
这三个能力叠加,移动端自动化从“工具”变成了“操作者”。你可以让 Agent 代做标注数据、填写表单、完成日常任务,甚至探索 App 的未知功能。比起以前写几百行脚本,用自然语言交付任务的方式,把使用门槛拉低了一个数量级。
1.3 考点一:从控件依赖到像素级理解
第一个新考点,也是最核心的变化:Agent 操作手机不再依赖控件,而是直接理解像素。这个转变带来不少新问题。
像素级理解意味着 Agent 需要回答几个问题:界面里有哪些可操作元素?每个元素是什么类型?它们的位置在哪?哪些元素当前可用?哪些是广告或装饰?如果模型把“广告关闭按钮”当成“跳过头像”,就会做出一连串错误操作。
实际工程中,通用视觉语言模型对复杂界面的“元素粒度”把握并不稳定。它可能识别出页面中央有一个“确认支付”按钮,却分不清这个按钮是置灰还是可点;可能把弹出框里的“取消”看成页面的主按钮。这时候通常需要补充一个专门的 UI 元素识别层,用目标检测或 OCR 先完成细粒度元素提取,再把结构化元素列表喂给 Agent 做决策,而不是让大模型直接对着原始像素推理。这一层看起来多余,实际上是整个方案的稳定基石。
2. 移动端Agent的核心技术拆解:视觉、动作与反馈闭环
2.1 视觉感知:截图之后AI到底在看什么
大多数移动端 Agent 基于“截图—理解—行动”循环工作。第一步很简单,通过系统截图拿到当前屏幕的图像。第二步最复杂,模型需要从图里提取三类信息:空间信息,即每个可交互元素在屏幕上的坐标区域;语义信息,即这个元素是什么,比如“返回按钮”“搜索框”“商品卡片的加购按钮”;状态信息,即元素当前是什么状态,比如选中、禁用、加载中、已选规格。
这需要把通用视觉语言模型和一个细粒度 UI 识别模型配合使用。通用模型负责理解全局语义,判断当前页面属于哪个流程阶段;细粒度模型负责把元素框出来、打上标签。两者结果合并后,Agent 才做出行动决策。
这里有个容易被忽略的细节:截图分辨率必须与操作坐标系严格对齐。很多手机默认开启了屏幕缩放或系统 UI 调整,截图尺寸和实际触摸坐标之间不是简单的等比关系。有的 Agent 在开发机上一切正常,换到真机上点击位置全部偏移,原因就是忽略了系统显示区域和截图区域的坐标换算。
2.2 动作空间:不是只有“点击”和“滑动”
Agent 能执行的动作决定了它有多大本事。基础动作包括点击、长按、滑动、输入文字、返回桌面、切换 App 等。这套动作的实现方式通常有两种:一种是通过系统级调试通道注入触摸事件,另一种是借助无障碍服务发送手势。前者需要开启开发者调试模式,对绝大多数安卓设备有效;后者不需要连接电脑,但需要用户在系统设置里授权,且部分设备上性能受限。
除了基础动作,真正高级的动作是“复合动作”。比如“在输入框里输入一段文本并触发搜索”,Agent 需要先点击输入框唤出软键盘,再逐字符输入,再点击搜索键。这中间任何一步被输入法的联想词拦截,都会导致结果偏移。工程上通常会关闭或绕过输入法联想、禁用系统动画,甚至直接通过剪切板粘贴文本代替模拟键入,以减少不确定性。
动作层最忌讳的是“只会点”。很多真实任务需要双指缩放、长按菜单、跨应用拖拽,如果 Agent 的动作空间只有点击和滑动,很多任务根本完不成。实现动作的时候还要考虑物理约束:两次点击之间的最小间隔、滑动速度过快导致系统识别为快速滑动、长按触发原生菜单等。
2.3 状态评估:怎么判断这一步真的做对了
Agent 每一步操作之后,必须判断这次操作是否达到预期,否则它可能在错误道路上越走越远。常用的校验手段有四种:UI 文本断言,检查页面上是否出现预期的文字;控件树断言,检查某个节点的属性变化;图像对比,对比操作前后的截图,判断界面是否产生预期变化;OCR/语义校验,读取界面上的关键信息,判断业务流程是否推进。
实际项目中,单一校验手段经常不够。比如点击“提交订单”后,屏幕上同时出现“订单提交成功”和“支付页面”,Agent 如果只认“成功”字样,可能会忽略后续支付步骤;反过来,如果网络慢,页面还没加载出来,截图里没有“成功”字样,Agent 可能误判失败而重复提交。更稳妥的做法是“后端状态 + 界面状态”双重确认:既能查接口返回,又看界面反馈,两边都对才算成功。
这里要提一个工程技巧:给每次截图盖一个时间戳水印,或者在日志里记录操作前的状态哈希。排查问题时能清楚知道每一步操作时屏幕真实长什么样,而不是依靠 Agent 事后回忆。
2.4 考点二:长任务的状态记忆与中途恢复
第二个新考点是长任务的状态管理。移动端任务天然又长又碎,比如“对比三家公司的小程序里同一款商品的价格,然后告诉我哪家最便宜”。Agent 可能需要切换多个 App、回到桌面、再进入另一个 App,中间还可能被电话、通知、系统弹窗打断。
一旦任务超过五六步,模型自身的上下文就开始吃紧。保持“目标不变”比“记住每一步做了什么”更重要。工程上需要引入任务状态机:把大任务拆成阶段,每个阶段迁移必须满足前置条件;把 Agent 的短期记忆放在独立模块里,而不是全部塞进模型上下文。很多 Agent 走到一半突然开始重复同一操作,就是因为“当前处于哪个阶段”这个关键状态丢失了。
中途恢复是最容易翻车的场景。App 杀掉重进后回到首页,Agent 的下一步计划却还停留在“上一个 App 的第三页”,这时候必须重新做视觉定位,再决定动作。更严重的是某些任务本身带有破坏性,比如支付、删除、发送消息,一旦任务中断又重启,可能导致重复执行。这类任务必须设计幂等控制:执行前记录任务的唯一 ID,每次执行前检查是否已经完成,绝不盲目重复。
3. 从Demo到可用:移动端Agent的真实工程实践
3.1 环境准备:让Agent拿到“手”和“眼睛”
在真机上跑 Agent,第一步是准备一套可复现的运行环境。硬件方面选一台测试机,最好是系统原生、没有多余定制、分辨率固定的安卓设备;开发阶段建议固定竖屏、关闭自动旋转、关闭系统字体缩放,减少变量。
连接方式上,我习惯先通过无线调试或 USB 连接手机,启用开发者选项。为了让 Agent 能模拟点击,还需要打开无障碍服务或调试通道的注入权限。注意:系统级调试通道在部分高版本系统上需要额外配置,否则截图正常但点击事件发不进去。
网络方面,测试机建议连一个可控网络环境,关闭所有系统更新的自动下载。手机里安装目标 App,建议固定版本,不要开自动更新,否则某一次任务跑到一半 App 升级了,界面全变,Agent 直接抓瞎。
还需要准备一个“状态快照”机制:任务开始前记录当前前台 App、系统设置项、App 登录态;任务结束后恢复现场。没有这套机制,跑十次任务能八次撞上上一次的遗留状态。
3.2 任务拆解实例:让Agent完成一次外卖下单
拿一个高频演示场景来说:让 Agent 在某个外卖 App 里自动完成一次下单。注意,这只是一个演示级任务,真实生产环境必须增加人工确认环节,后面我会讲安全边界。
把任务拆成六个阶段:第一,打开 App,等待首页加载完成,判断登录态;第二,在搜索框输入“牛肉面”,执行搜索;第三,在结果列表里选择评分最高的一家店,进入店铺页;第四,选择第一个商品,点击加入购物车,必要时选择规格;第五,进入购物车核对商品,点击结算;第六,在确认订单页停留,不实际支付,输出当前订单金额与收货地址。
每阶段都有明确的完成判据。阶段三的判据可以是“页面标题包含店铺名”;阶段四的判据可以是“购物车角标数字加一”。这些判据要写进 Agent 的指令里,否则模型会自由发挥,比如搜索词变了、商家选错了、商品重复加购。
这里不要追求“全自动代客下单”,至少现阶段不要。把任务边界划定到“完成支付前一步”,既能验证整套自动化能力,又不会因为误操作造成真实损失。
3.3 给Agent写操作说明书:提示词与参数设计
Agent 不会平白无故知道你的业务规则,需要一份“操作说明书”。这不是简单一句“帮我去买个东西”,而是要写清楚:任务目标是什么、边界在哪里、每步的判据是什么、遇到哪些情况必须停下来求助。
一个有效的操作指令通常包含:任务目标,必须明确、可验证,比如“在某平台找到评分最高的耳机,截图保存”;边界约束,比如“不修改收货地址”“不点击任何广告”“不安装任何应用”;分阶段指令,每个阶段给出输入、动作、期望输出、成功判据;停止条件,出现什么情况必须中止并报告,比如“弹出了登录框”“找不到商品”“余额不足”。
参数方面,需要配置每步操作的等待时间、失败重试次数、单任务最大操作步数。等待时间太短,页面没加载出来就开始下一步;太长,任务效率极低。我一般把页面加载等待设为 5 到 8 秒,每次截图后给模型 2 到 3 秒推理缓冲,重试次数不超过 3 次。最大操作步数建议设置为人工预期步数的 1.5 倍,超过即判定异常。
3.4 考点三:异常处理与安全边界
第三个新考点,也是最容易被忽略的一点:Agent 操作真实手机时,后果是真实的。点击“支付”真的会扣钱,点击“删除”真的会删数据。安全边界必须在架构层强制约束,而不是指望模型自觉。
我建议至少做三件事。第一,高风险动作隔离:涉及支付、删除、发送消息、修改隐私设置的操作,一律要求二次人工确认,Agent 只能做到“最后一步之前”,然后在界面上高亮提示等待人类确认。第二,操作白名单:在系统层面设置 Agent 可访问的 App 列表,不在白名单里的应用一律不允许唤起,防止 Agent 被恶意跳转带到奇怪的地方。第三,预算与资源控制:限制每轮任务的最大执行时间、最大操作步数、最大网络请求量,超过阈值强制中止并生成报告。
还有一个隐蔽风险:Agent 可能在任务过程中读取到用户隐私信息。比如执行“查看订单详情”时,屏幕上可能包含手机号、地址等敏感数据。工程上要建立敏感信息脱敏机制,在截图进入模型前对手机号、姓名、验证码区域做遮罩处理;日志里也不得记录明文敏感字段。这个约束不仅仅是为了合规,更是为了避免在调试时把用户隐私留在日志文件里。
4. 踩坑与排查实录:移动端Agent最常见的5个问题
4.1 坐标偏差与分辨率适配
真机环境下的第一个大坑是坐标偏差。常见场景:开发时用一台设备调试,Agent 所有动作都准确;换到另一台分辨率不同的设备上,点击全部歪掉。原因一般是两个坐标系没对齐:截图使用的是屏幕像素坐标,而动作注入使用的是设备逻辑坐标;不同设备对系统缩放的处理又不一样。
排查方法很直接:在屏幕上人为放置几个标记点,通过 Agent 截图获取坐标,再手动触摸同一位置,对比两者偏差。如果偏差是线性的,多半是缩放比例问题;如果偏移只出现在屏幕下半部分,要考虑软键盘和系统导航栏的占位影响。
解决方案是在框架层固定一个“参考分辨率”,所有截图先缩放到参考分辨率再做识别,所有动作坐标再换算回实际设备坐标。不要让 Agent 直接拿原始截图尺寸做空间推理,这是我在几个项目里反复踩坑后总结出的第一条经验。
4.2 弹窗、权限请求与系统干扰
真机操作的最大干扰源是弹窗。应用内弹窗包括广告、升级提示、新功能引导、系统权限申请。Agent 识别到“跳过”“以后再说”这类文字后,经常出现两种情况:找不到按钮的准确位置,或者误把“关闭广告”点成“点击广告”。
系统级的干扰更棘手,比如低电量弹窗、来电通知、SIM 卡错误提示。这些弹窗样式不一样,坐标不固定,通用模型不一定认识。我的处理方式是把弹窗检测做成独立的预处理模块:任务执行前和每步操作后都做一次“前台 App 检测 + 窗口层级检测”,一旦发现当前显示的不是目标 App,就进入弹窗处理流程,优先尝试点击明确的安全关闭按钮;无法识别时直接终止任务,而不是乱点。
在实际跑任务时,我会提前准备好一批常见弹窗截图,用于回归测试弹窗处理逻辑。弹窗处理不准,Agent 后面所有动作都白做。这个模块一定要排在模型决策之前,而不是让模型临时判断要不要关掉弹窗。
4.3 模型误判:界面对了不代表任务对了
Agent 看似在执行,实际可能完全跑偏。典型表现:每一步都能给出一个合理的动作,但几个步骤之后离目标越来越远。问题通常出在“局部正确,全局错误”——模型每一步都基于当前截图做决策,却没有把“最终目标”放在足够高的优先级上。
我在日志里见过很典型的情况:任务是找到某商品的用户评价,Agent 前几步正常,中间误点了一个相似商品进入详情页,然后把“该商品详情页”当成了目标页面,继续执行“查看评价”,最后输出一套根本不相关的内容。
排查这种问题,要把每一步操作前后的截图、模型思考摘要、执行动作三者关联起来回放。如果发现 Agent 连续三步以上没有朝目标推进,应立即触发“回到任务轨道”机制,重新审视当前页是否偏离目标,必要时回到上一步重做。不要等到任务结束了才去检查效果,那样既浪费时间又浪费模型调用额度。
4.4 性能开销与响应时间预算
移动端 Agent 不是免费的:截图、模型推理、动作执行、状态校验,每一步操作通常需要 1 到 5 秒,长任务累计下来非常慢。我实测过一个 20 步的操作流程,在主流配置的测试机上跑完大约需要 1 分半钟,在低端机上可能超过 3 分钟。
如果你要跑批量任务,性能瓶颈会直接变成成本问题。优化方向有三个:一是减少不必要的模型调用,能用文字断言解决的问题就不要调用视觉模型;二是降低截图频次,状态稳定时直接复用上一次的识别结果;三是让模型只处理关键区域,比如只裁剪出按钮区域做识别,而不是每次全屏送进去。
另一个办法是把“重识别”和“轻校验”分开:轻校验用规则和 OCR 快速过滤明显错误,重识别才走大型模型。很多团队在 Demo 阶段不在意延迟,进入批量生产后被速度卡死,回头再优化就晚了。性能预算应该从一开始就写入设计文档。
4.5 环境恢复与状态隔离
跑任务之前最容易被忽略的是环境残留。上一次任务留下的购物车、搜索历史、通知角标,都会影响下一次任务的执行结果。比如你在测试“将商品加入购物车”,第一次执行成功后没有清空购物车,第二次执行时购物车就多了几个旧商品,Agent 可能因此误判“加购失败”。
我建议每个任务跑完后执行环境清理:清空目标应用数据或重置到初始状态,关闭所有后台应用,恢复默认系统设置,必要时重启设备。如果任务之间需要保留登录态,也要明确哪些状态允许保留,哪些必须重置。
不要把环境清理交给 Agent 自己执行,把它设计成独立的编排模块,由调度端在执行前、执行后分别触发。否则 Agent 很可能因为清理动作本身触发新的视觉判断,导致状态更加混乱。我见过一个项目把清理逻辑写进提示词里,结果 Agent 每次清理时都会“顺便”打开几个无关页面复盘,任务越跑越脏。
4.6 快速排查速查表
| 问题 | 典型现象 | 首选排查方向 |
|---|---|---|
| 点击偏移 | 点到的位置和预期不一致 | 截图坐标与动作坐标换算、屏幕缩放 |
| 弹窗干扰 | 任务中途被广告或系统弹窗打断 | 窗口层级检测、弹窗预处理模块 |
| 模型误判 | 连续动作但偏离目标 | 操作回放、阶段判据、目标偏离检测 |
| 执行缓慢 | 单步耗时过高 | 不必要的模型调用、全屏推理、等待时长 |
| 状态残留 | 第二次任务结果异常 | 环境清理、App 数据重置 |
| 点击无效 | 看到按钮但点不动 | 控件被遮挡、按钮置灰、动画未结束 |
这张表不是标准文档,是我自己调试时常用的排查起点。遇到问题先判断属于哪一类,再按对应方向处理,比盲目改提示词有效得多。实际排查时我还会额外加一个步骤:把 Agent 每一步的截图和动作日志导出成 HTML 回放页面,肉眼过一遍整个操作序列。这个习惯帮我发现了大量单点日志看不出来的连续误判,强烈建议你也搭一个类似的可视化回放工具。
真把 Agent 接到真实手机上之后,我最大的体会是:这活儿最大的瓶颈不在模型,而在工程。模型能力已经够让 Agent“看懂”屏幕,难的是让它在千百种意外里稳定输出、不越界、不重复、不泄密。刚开始做的时候,我把大量精力花在提示词和模型选型上,后来发现真正决定项目能不能跑下去的是状态管理、坐标转换、异常隔离、环境清理这些看似不起眼的模块。如果你也要做类似的事,我建议先别急着追求“一键完成所有任务”,从一个小范围、高校验、可回退的任务开始,先把工程骨架搭稳,再慢慢放开 Agent 的操作边界。这个方向这两年演进很快,但越是能力强的工具,越需要把护栏做扎实。