1. 移动端 AI 自动化的破局点:ARTEMIS 到底在解决什么问题
移动端自动化这件事,做过的朋友都知道有多折腾。早些年我们用 Appium、UiAutomator、XCUITest 这一套,写脚本、定位元素、处理各种弹窗和异步加载,一个简单的“打开 App 点几下”的流程,光调试就能耗掉大半天。更别提 App 一更新,UI 结构变了,脚本全废,维护成本高得离谱。后来有了无障碍服务(Accessibility Service),能拿到界面节点树了,但本质上还是“写死规则”的思路——你得告诉机器每一步点哪里、输入什么,机器本身不理解屏幕上的内容。
ARTEMIS 这个项目,是谷歌开源的一套移动端 AI 自动化框架,核心思路跟传统方案完全不一样。它让 AI 助手像人一样“看”手机屏幕、“理解”当前界面、“决定”下一步操作,然后通过底层能力去执行点击、滑动、输入这些动作。换句话说,你不再需要写一堆元素定位和流程分支,而是给 AI 一个目标,比如“帮我在购物 App 里搜一下蓝牙耳机并加入购物车”,它自己看着屏幕一步步完成。
这个项目适合谁?三类人值得重点关注。第一类是做移动端测试和自动化的工程师,想从“写脚本”升级到“描述目标”的工作方式;第二类是做 AI Agent 应用的开发者,需要让 Agent 具备操作手机 App 的能力;第三类是对 MCP(Model Context Protocol)生态感兴趣的技术人,ARTEMIS 跟 MCP 的结合是当前很热的一个方向。哪怕你只是想了解“AI 操作手机”这件事到底怎么落地的,这篇文章也能给你一个完整的认知框架。
我先把结论放前面:ARTEMIS 的价值不在于它现在有多成熟,而在于它把“视觉理解 + 动作规划 + 设备控制”这条链路打通了,并且用开源的方式让所有人都能上手试。下面我从设计思路、核心细节、实操流程、问题排查几个维度,把它拆开讲透。
2. 整体设计思路拆解:为什么是“看屏幕 + 做决策”这条路
2.1 传统移动端自动化的三条老路和它们的死穴
要理解 ARTEMIS 为什么这么设计,得先看清楚以前的路子卡在哪。
第一条路是基于元素定位的脚本自动化,代表就是 Appium 和 UiAutomator。它的逻辑是:通过 accessibility id、resource-id、xpath 这些方式找到界面上的控件,然后对控件执行操作。这条路的问题是强依赖 UI 结构的稳定性。开发改个布局、换个 id,脚本就崩。而且很多 App 用的是自绘控件或者 WebView 混合渲染,节点树里根本拿不到有效信息,定位直接失败。
第二条路是基于图像识别的自动化,比如 Airtest 那套。它靠截图匹配来找目标位置,比元素定位更“视觉化”一些。但图像匹配对分辨率、主题、深色模式、动态内容都很敏感,模板图稍微对不上就找不到。而且它只能告诉你“这个图在哪”,不能理解“这个界面是干什么的”。
第三条路是基于无障碍服务的规则引擎,通过监听界面变化触发预设动作。这条路在特定场景下很稳,但本质还是人把所有分支写死,遇到没预料到的界面就卡住。
这三条路的共同死穴是:机器不理解屏幕内容,所有“理解”都来自人预先写好的规则。App 一变化,规则就失效。
2.2 ARTEMIS 的核心思路:把“理解”交给模型,把“执行”交给框架
ARTEMIS 换了个思路。它不再要求人告诉机器“点哪个坐标、找哪个 id”,而是让 AI 模型直接看屏幕截图,理解当前界面是什么、有哪些可操作的元素、当前处于什么状态,然后根据目标决定下一步动作。框架负责的是:截屏、把截图和上下文喂给模型、解析模型输出的动作指令、通过设备控制层执行动作、再截屏进入下一轮。这是一个典型的“感知—决策—执行”闭环。
这个设计的精妙之处在于职责分离。模型负责它最擅长的事——理解视觉内容和做语义决策;框架负责它最擅长的事——稳定地截屏、可靠地执行动作、管理状态和重试。两者通过一个结构化的动作协议对接,模型输出的是“点击坐标 (x, y)”或者“在输入框输入文本”这样的结构化指令,框架拿到就能执行。
为什么这个思路现在才可行?因为多模态大模型的能力上来了。以前的视觉模型只能做分类和检测,理解不了“这个界面整体是什么场景”。现在的大模型能看懂截图里的文字、按钮、列表、弹窗,还能结合目标做推理。这是 ARTEMIS 这类框架能成立的前提。
2.3 跟 MCP 的关系:为什么热词里全是 MCP
热词里 MCP 出现频率极高,这不是偶然。MCP 是 Model Context Protocol,一套让 AI 模型跟外部工具、数据源对接的协议标准。ARTEMIS 如果只是自己玩,价值有限;但它如果能通过 MCP 把“操作手机”这个能力暴露给各种 AI 助手和 Agent 平台,那想象空间就大了。
打个比方,MCP 就像是 AI 世界的 USB 接口标准。以前每个 AI 应用要接一个外部能力,都得自己写一套对接代码;有了 MCP,能力提供方按标准实现一个 Server,AI 应用按标准实现一个 Client,双方就能即插即用。ARTEMIS 作为移动端操作的 MCP Server,意味着任何支持 MCP 的 AI 助手都能获得“操作手机”的能力,不需要自己去啃设备控制的底层细节。
这也是为什么热词里会出现 playwright mcp、chrome devtools mcp、burpsuite mcp 这些——它们都是把不同领域的能力通过 MCP 暴露出去。ARTEMIS 补上的是移动端这一块。理解了这一层,你就明白 ARTEMIS 不只是一个自动化工具,它是移动端能力接入 AI Agent 生态的一个标准入口。
2.4 方案选型背后的取舍:为什么不用纯坐标点击
有人可能会问,既然模型能输出坐标,为什么不干脆全用坐标点击?这里有个实操层面的坑。纯坐标点击对屏幕分辨率、状态栏高度、导航栏样式极度敏感。同一台设备换个主题、转个屏,坐标就偏了。ARTEMIS 在实际设计里,动作空间通常包含多种类型:点击某个坐标、点击某个识别到的元素、滑动、输入文本、返回、等待等。框架会根据模型输出的动作类型,选择最稳妥的执行方式。
另一个取舍是截屏频率。每执行一个动作就截一次屏,能保证模型看到的是最新状态,但会增加延迟和 token 消耗。ARTEMIS 在这块通常会有策略,比如动作执行后等待界面稳定再截屏,或者对连续无变化的帧做去重。这些细节决定了实际跑起来的流畅度。
3. 核心细节解析与实操要点:从截屏到动作执行的完整链路
3.1 设备连接层:ADB 是绕不开的基础
ARTEMIS 要操作手机,第一步是建立设备连接。Android 侧基本都走 ADB(Android Debug Bridge)。你需要确保设备开启了开发者选项和 USB 调试,然后用adb devices能列出设备。如果是无线连接,还得先配对再连接。这一步看着简单,但坑不少。
注意:ADB 版本要和设备系统版本匹配。太老的 ADB 连新系统设备经常出现 unauthorized 或者 offline 状态。建议用较新的 platform-tools。
连接建立后,框架通过 ADB 执行截屏(adb exec-out screencap -p)、点击(adb shell input tap x y)、滑动(adb shell input swipe)、输入文本(adb shell input text)这些命令。这些命令的延迟和稳定性直接决定了自动化的流畅度。实测下来,exec-out比先screencap到文件再pull要快不少,因为省去了文件落盘和传输的开销。
3.2 截屏与图像预处理:模型看到的是什么
截屏拿到的是原始 PNG 数据。直接喂给模型行不行?行,但不够好。实际项目里通常要做几件事:缩放、压缩、必要时裁剪。缩放是因为原始截图分辨率可能很高(比如 1440x3200),直接传给模型 token 消耗大、推理慢。压缩是为了减小传输体积。裁剪则是针对某些场景,比如只关心内容区域,把状态栏和导航栏裁掉。
这里有个经验:缩放比例要保证界面上的文字仍然可读。缩得太狠,模型看不清按钮上的字,决策就会出错。一般把长边缩到 1080 或 720 是比较稳妥的区间。另外,截图格式用 JPEG 还是 PNG 也有讲究,JPEG 体积小但可能有压缩伪影,PNG 无损但体积大。实际用下来,质量参数调到 80 左右的 JPEG 在清晰度和体积之间平衡得比较好。
3.3 模型交互与动作协议:结构化输出是关键
框架把截图和当前目标、历史动作一起组织成 prompt 发给模型。模型返回的必须是结构化的动作指令,不能是自然语言。为什么?因为框架要解析它去执行。如果模型返回“我觉得应该点击右上角的搜索按钮”,框架没法直接执行,还得再做一层解析,容易出错。
所以 ARTEMIS 这类框架通常会定义一套动作 schema,比如:
{ "action": "tap", "x": 540, "y": 1200, "reason": "点击搜索框" }或者:
{ "action": "type", "text": "蓝牙耳机", "reason": "在搜索框输入关键词" }模型被要求按这个格式输出。框架解析后,映射到对应的 ADB 命令执行。这套协议的设计质量,直接决定了整个系统的可靠性。动作类型太少,表达能力不够;太多,模型容易选错。常见的动作集合包括:tap、swipe、type、back、home、wait、done。其中 done 表示任务完成,框架收到就停止循环。
3.4 状态管理与循环控制:别让 AI 陷入死循环
AI 操作手机最怕什么?陷入死循环。比如它一直点某个按钮,但界面没反应,它就反复点。或者它在两个界面之间来回跳。框架必须有循环控制机制。
常见的做法是:设置最大步数上限,比如 30 步还没完成就终止;检测连续重复动作,如果连续几步动作完全一样且界面没变化,就判定卡住,触发重试或终止;维护一个已访问状态集合,避免反复回到同一个界面。这些机制看着不起眼,但没有它们,实际跑起来会非常痛苦。
实操心得:最大步数不要设太大。我试过设 50 步,结果模型在某个界面卡住后疯狂空转,白白消耗 token。后来改成 20 到 25 步,配合重复动作检测,效果好很多。
3.5 提示词工程:目标描述的质量决定成败
给 AI 的目标描述怎么写,直接影响成功率。“帮我买东西”这种太模糊,模型不知道买什么、在哪买。“打开某购物 App,在搜索框输入蓝牙耳机,点击搜索,找到第一个结果加入购物车”这种就具体得多。但也不能太死板,太死板就退化成脚本了,失去了 AI 自动化的意义。
好的目标描述是“意图清晰 + 留出执行自由度”。比如“在购物 App 里搜索蓝牙耳机并加入购物车”,意图清晰,但具体怎么点、点哪个搜索框、怎么加购,交给模型自己判断。这样既保证了方向正确,又发挥了模型的灵活性。
4. 实操过程与核心环节实现:从零跑通一个自动化任务
4.1 环境准备清单与版本选择
先把环境搭起来。以下是我实测下来比较稳的一套组合:
| 组件 | 推荐选择 | 说明 |
|---|---|---|
| 操作系统 | macOS 或 Ubuntu 22.04 | Windows 也能跑,但 ADB 和 Python 环境配置略麻烦 |
| Python | 3.10 或 3.11 | 太新的版本某些依赖可能没适配 |
| ADB | platform-tools 最新版 | 版本太老连不上新设备 |
| 设备 | Android 10 以上真机 | 模拟器也能用,但真机更接近实际场景 |
| 模型 | 支持视觉输入的多模态模型 | 需要能理解截图内容 |
设备这边,建议用真机而不是模拟器。模拟器的截屏和输入延迟通常比真机高,而且某些 App 在模拟器上行为不一致。真机的话,一台中端 Android 手机就够用,不需要旗舰。
4.2 设备连接与 ADB 调试实操
第一步,手机开启开发者选项。进入设置,找到“关于手机”,连续点击“版本号”七次,开发者选项就出来了。然后在开发者选项里打开“USB 调试”。
第二步,用数据线连接电脑。手机上会弹出“是否允许 USB 调试”的授权弹窗,勾选“始终允许”并确认。
第三步,验证连接:
adb devices正常输出应该是:
List of devices attached XXXXXXXX device如果显示unauthorized,说明授权没通过,拔掉重插,重新确认弹窗。如果显示offline,试试adb kill-server然后adb start-server。
第四步,测试截屏和点击:
adb exec-out screencap -p > screen.png adb shell input tap 540 1200截屏能拿到图、点击有反应,说明设备控制链路通了。
注意:有些手机厂商对 ADB 输入有限制,尤其是输入中文文本时,
adb shell input text可能不支持非 ASCII 字符。遇到这种情况,可以考虑用 ADB Keyboard 这类输入法方案,或者让模型尽量用英文关键词搜索。
4.3 框架配置与模型接入
ARTEMIS 的配置通常包含几块:设备参数、模型参数、动作空间定义、循环控制参数。设备参数里要指定设备序列号(多设备时)、截屏缩放比例。模型参数里要配 API 地址、密钥、模型名称、超时时间。动作空间定义决定了模型能输出哪些动作。循环控制参数包括最大步数、重复检测阈值、每步等待时间。
一个典型的配置大概长这样(以 YAML 为例):
device: serial: "XXXXXXXX" screenshot_scale: 0.5 screenshot_format: "jpeg" screenshot_quality: 80 model: provider: "your_provider" model_name: "your_vision_model" max_tokens: 1024 timeout: 30 loop: max_steps: 25 repeat_threshold: 3 step_wait: 1.5 actions: - tap - swipe - type - back - home - wait - donescreenshot_scale: 0.5表示把原始截图缩放到一半。step_wait: 1.5表示每个动作执行后等 1.5 秒再截屏,给界面留出响应时间。这个值要根据 App 的响应速度调,太快了截到的是过渡动画,太慢了整体效率低。
4.4 跑通第一个任务:搜索并加购
配置好之后,写一个任务描述,启动框架。任务描述我一般这么写:
打开购物 App,在搜索框输入“蓝牙耳机”,点击搜索按钮,在搜索结果中找到第一个商品,点击进入详情页,点击加入购物车。
启动后,框架开始循环:截屏 → 发给模型 → 模型返回动作 → 执行动作 → 再截屏。你可以在日志里看到每一步的决策过程,比如:
Step 1: 截屏完成,发送给模型 Step 1: 模型返回 action=tap, x=540, y=200, reason=点击搜索框 Step 1: 执行点击 (540, 200) Step 2: 截屏完成,发送给模型 Step 2: 模型返回 action=type, text=蓝牙耳机, reason=输入搜索关键词 Step 2: 执行输入 ... Step 8: 模型返回 action=done, reason=已加入购物车 任务完成,共执行 8 步第一次跑,大概率不会一次成功。可能模型点错了位置,可能界面加载慢导致截屏时机不对,可能弹出了权限弹窗模型没处理。这些都是正常的,需要根据日志逐步调。
4.5 参数调优:让任务跑得更稳
调优主要围绕几个参数。step_wait如果设得太短,模型看到的是加载中的界面,决策容易出错;设得太长,整体耗时增加。我的经验是先从 1.5 秒起步,观察日志里有没有“截到加载中界面”的情况,有就往上加。
screenshot_scale影响模型看清文字的能力。如果发现模型经常认错按钮上的文字,把缩放比例调大,比如从 0.5 调到 0.7。代价是 token 消耗增加、推理变慢。
max_steps要留出余量。一个正常的搜索加购流程大概 6 到 10 步,设 25 步足够。设太小,任务没完成就被截断;设太大,卡住时浪费资源。
repeat_threshold控制重复检测的灵敏度。设成 3 表示连续 3 步动作相同且界面无变化就判定卡住。设太小容易误判(比如连续两次点击同一个位置是正常的),设太大卡住后要等很久才触发。
5. 常见问题与排查技巧实录
5.1 模型决策类问题
问题一:模型点错位置。最常见的原因是截图缩放后坐标映射出错。模型看到的是缩放后的图,输出的坐标是基于缩放图的,框架执行时要映射回原始分辨率。如果映射公式写错,点击位置就会偏。排查方法:把模型输出的坐标和实际点击位置对照,看偏差是不是成比例。如果是,就是映射问题。
问题二:模型理解错界面。比如把“加入购物车”按钮认成“立即购买”。这通常是截图清晰度不够或者模型能力不足。先试着提高截图质量,如果还不行,可能得换更强的视觉模型。
问题三:模型输出格式不对。有时候模型会返回自然语言而不是结构化 JSON。这需要在 prompt 里加强格式约束,或者在框架层加一层容错解析,尽量从自然语言里提取动作意图。
5.2 设备执行类问题
问题一:点击没反应。可能是坐标超出了可点击区域,或者点击时界面还在动画中。加长step_wait通常能解决。也可能是 App 对 ADB 注入的点击事件做了拦截,这种情况比较麻烦,需要换注入方式。
问题二:输入文本失败。前面提过,adb shell input text对中文支持不好。解决方案是用 ADB Keyboard,先把输入法切到 ADB Keyboard,再通过广播发送文本。或者让模型尽量用英文或拼音关键词。
问题三:截屏黑屏或花屏。某些 App 出于安全考虑会禁止截屏(比如银行类 App),截出来是黑屏。这种情况 AI 自动化基本没法做,因为模型看不到内容。另外,视频播放界面截屏可能花屏,也是类似原因。
5.3 流程控制类问题
问题一:陷入死循环。前面讲过,靠最大步数和重复检测来兜底。但更好的做法是在 prompt 里告诉模型“如果连续两次操作后界面没有变化,尝试其他方式”。让模型自己有这个意识,比纯靠框架兜底更优雅。
问题二:任务提前终止。模型可能误判任务完成,提前输出 done。这通常是目标描述不够清晰,模型觉得“差不多完成了”。把目标描述写得更具体,明确完成条件,能减少这种情况。
问题三:多步任务中途丢失上下文。长流程任务里,模型可能忘了最初的目标。解决办法是在每一步的 prompt 里都带上原始目标,而不是只带最近几步的动作历史。
5.4 常见问题速查表
| 现象 | 可能原因 | 排查方向 | 解决思路 |
|---|---|---|---|
| 点击位置偏移 | 坐标映射错误 | 对照缩放前后坐标 | 检查映射公式 |
| 模型认错按钮 | 截图不清晰 | 提高缩放比例 | 调大 screenshot_scale |
| 输出非结构化 | prompt 约束不足 | 检查模型返回原文 | 加强格式约束 |
| 点击无反应 | 界面未稳定 | 观察截屏时机 | 加长 step_wait |
| 中文输入失败 | ADB 限制 | 测试 input text | 用 ADB Keyboard |
| 截屏黑屏 | App 禁止截屏 | 换 App 测试 | 无解,放弃该场景 |
| 死循环 | 缺少循环控制 | 看日志重复动作 | 调低 repeat_threshold |
| 提前终止 | 目标描述模糊 | 检查 done 触发时机 | 细化完成条件 |
独家避坑技巧:调试阶段一定要把每一步的截图保存下来。光看日志你不知道模型当时看到的是什么,只有把截图和决策对照着看,才能快速定位是“模型看错了”还是“模型看对了但执行错了”。我一般会在调试时开一个 debug 目录,每步存一张截图加一个 JSON 记录,排查效率能提升好几倍。
6. 这套框架的边界在哪里,以及怎么用它做更有价值的事
ARTEMIS 这类框架现在的能力边界其实挺清晰的。它擅长的是那些界面相对标准、操作路径不太复杂、对实时性要求不高的任务。比如 App 功能测试、批量数据录入、跨 App 的信息搬运、重复性的日常操作。这些场景下,AI 自动化的灵活性和抗变化能力,确实比传统脚本强不少。
但它也有明显不擅长的领域。需要精确时序控制的操作(比如游戏里的连招)、涉及敏感权限和支付的流程、界面变化极快或者大量动态内容的场景,目前都不太适合。这不是 ARTEMIS 一家的问题,是整个“视觉理解 + 动作规划”路线的共同局限。
真正让我觉得有意思的,是它跟 MCP 生态结合后的可能性。当“操作手机”变成一个标准化的 MCP 能力,任何 AI 助手都能调用它,那很多以前需要人手动完成的事情就可以被编排进自动化流程里。比如一个 Agent 可以先用浏览器查资料,再通过 ARTEMIS 操作手机 App 完成下单,整个过程不需要人干预。这种跨端的能力编排,才是移动端 AI 自动化真正让人兴奋的地方。
如果你现在想上手,我的建议是先从最简单的单步任务开始,比如“打开设置,把亮度调到最高”。跑通了,再逐步增加步骤复杂度。别一上来就搞跨 App 的长流程,那样出问题你都不知道是哪一环。另外,把调试基础设施搭好,截图存档、日志分级、每步耗时统计,这些前期投入会在后面省下大量时间。我踩过的坑基本都集中在“没看清模型当时看到了什么”上,把这个问题解决了,调试效率会有质的提升。