☰
ARTEMIS:多模态大模型驱动的手机屏幕智能体自动化框架
2026/11/3 8:35:58 网站建设 项目流程

1. 从"脚本点按钮"到"看屏幕点按钮":ARTEMIS 为什么在这个时间点出现

我最初看到"谷歌开源移动端 AI 自动化框架"这几个字的时候,第一反应不是"又一个 Demo",而是想到一个非常具体的场景:你跟手机说"帮我把上一个来电号码存成联系人,备注叫王工",然后 AI 真的自己打开拨号、翻通话记录、点新建联系人、逐项填写、保存,全程不需要你碰屏幕。

这种"像人一样操作手机"的能力,过去十几年一直有人在尝试,但绝大多数路径走的是脚本自动化:要么给每个元素写死 ID 和坐标,要么依赖系统控件树逐层查找。问题是,真实手机 App 的界面不是表格,而是充满动效、弹层、轮播图、键盘、权限框的动态画面。你让脚本跑一遍自测没问题,一旦换个 ROM、换个屏幕尺寸、App 改版一次,脚本可能当场就废了。

ARTEMIS 给我的第一印象,就是它把这个问题彻底换了赛道:不再要求你去"告诉机器每个按钮在哪",而是让模型直接看截图,理解当前界面的含义,再决定下一步按哪里、滑哪里、输入什么。这种思路在 2023 年之前基本不可能落地——当时的小模型看不出屏幕上哪个区域是"确认付款",哪个文案是标题还是按钮。但在多模态大模型成熟之后,屏幕上的一草一木对模型来说都是可以被推理的视觉信息,ARTEMIS 这类框架才有了真正的土壤。

这个项目对哪类人价值最大?我觉得是三类:一是做 App 自动化测试的工程师,想用自然语言描述代替一条条写脚本;二是做智能体应用的产品经理和开发者,希望让大模型真正落到"操作真实软件"而不是只停留在聊天框;三是个人开发者,想在夜深人静的时候跑通一个能替你操作手机的 Agent,然后把经验迁移到其他端侧场景。

我自己实际把类似的框架跑过几遍之后,最大的体会是:这类项目真正的门槛不在模型,而在工程。模型只看截图就能输出"点击坐标"这件事已经非常成熟,但怎么保证每一次点击都稳定、怎么处理系统弹窗抢焦点、怎么在长任务里不让 Agent 迷路,这些才是决定项目能不能从"能跑"变成"能用"的关键。ARTEMIS 的价值就是把这些工程细节封装成了相对完整的流水线,让你可以直接站在上面继续做自己的事。

2. 感知-决策-执行闭环:ARTEMIS 内部到底是怎么运作的

你如果打开 ARTEMIS 这类框架的源码,会发现它的核心逻辑并不复杂,甚至可以拆成三个非常清晰的模块:感知(Perception)、决策(Planning)、执行(Execution)。理解这个闭环,是之后调参、排错、做二次开发的基础。

2.1 感知层:它怎么"看"到屏幕

手机屏幕对 Agent 来说,本质上就是一张截图加一棵 UI 控件树。ARTEMIS 的感知层会同时拿到两样东西:一是通过adb exec-out screencap -p抓取的实时屏幕截图;二是通过uiautomator dump导出的控件布局描述,里面包含每个控件的类型、文本、坐标范围、是否可点击等信息。

这里有一个很关键的细节:截图和控件树是两套不同步的信息。截图是位图,适合给视觉模型做整体理解,比如"界面上方有一张广告横幅";控件树是结构化文本,适合给模型提取精确的按钮坐标和文案,比如"这个叫'确定'的按钮在 x=540, y=1800 的位置"。ARTEMIS 的策略是两者都抓,然后让模型融合判断——视觉模型回答"当前界面大概在干嘛",结构化信息回答"哪些位置可以点"。这种双通道设计能显著减少模型对按钮位置的误判,尤其是遇到图标按钮、纯图片广告这类没有文本信息的区域。

当然,双通道也有坑。uiautomator dump在部分国产 ROM 上可能输出为空,或者控件树里有大量无用节点,比如一个 TextView 嵌套六七层。处理办法一般是对控件树做裁剪,只保留clickable="true"的节点和关键文本节点,再做一次去重和排序,把内容压到模型上下文能接受的范围内。ARTEMIS 在这个环节做得比较扎实,它会做坐标归一化,把像素坐标统一映射到 0~1000 的相对坐标,这样换设备之后模型输出不会乱。

2.2 决策层:模型怎么决定"下一步点哪里"

拿到屏幕信息之后,决策层要回答的问题是:离用户的目标还有多远,接下来应该执行什么动作。这里 ARTEMIS 采用的动作空间非常接近人机交互的基础单元,一般包含六类:

  • tap:单击某个坐标点
  • long_press:长按
  • swipe:滑动,带起点、终点和时长
  • text_input:输入文字
  • key_event:按键事件,比如返回键、Home 键
  • wait:等待若干毫秒,让页面加载完成

模型每轮推理都会输出一个结构化动作,通常是一段 JSON,例如:

{ "thought": "当前页面是通话记录列表,目标联系人叫王工,我需要点击第一条记录进入详情。", "action": { "type": "tap", "coordinate": [540, 300], "description": "点击通话记录第一条" } }

这里最有意思的是 "thought" 字段。它不只是给开发者看的,而是在多轮任务中帮助模型维持状态--当任务长达十几步时,模型可以借助之前的思考链条回顾自己做到哪一步了,避免出现"已经保存了联系人又去打开拨号盘"这种迷失。我实测下来,长任务稳定性的一大提升就是靠这个显式的思考输出。

2.3 执行层:动作如何落到真实手机

决策层只输出意图,真正让手机动起来的是执行层。ARTEMIS 的执行层底层走的是 Android 的 ADB 通道,通过adb shell input tap x y注入点击事件,通过adb shell input swipe模拟滑动,输入文字则走adb shell input text。

但如果你以为只是把命令原样发出去,那就太天真了。实际执行中会遇到一个问题:动作太快,界面还没反应过来。特别是某些页面有转场动画,你点击后界面要过几百毫秒才跳到下一页,如果 Agent 立刻截图准备下一轮决策,截到的往往是过渡帧或者上一页的残影。所以 ARTEMIS 在动作之后通常会加一个固定等待或者动态等待,比如等待页面上的某个关键控件出现,然后再进入下一轮循环。这个细节看起来不起眼,却是整个项目能不能稳定跑完一个长任务的分水岭。

2.4 Mini Agent 的完整循环

把三个模块串起来,整个 Agent 的运行循环其实就是一个 while 循环:

while not task_completed: screenshot = capture_screen(device) ui_tree = dump_ui_tree(device) observation = build_observation(screenshot, ui_tree) action = model.plan(observation, task_description, history) execute_action(device, action) history.append(action) sleep(0.5)

循环的终止条件也很讲究,不是"模型说结束就结束",而是要满足两个条件之一:要么模型明确输出task_completed: true,要么连续多轮动作重复且无进展,触发超时保护。否则模型会在一些界面上反复尝试同一个点击,白白消耗 token。

3. 自己动手跑通 ARTEMIS:环境搭建与第一个自动化任务

讨论再多架构,不如实际跑一遍。下面这部分基于我自己的操作经验,尽量按一条可以直接照着做的路径来写。

3.1 环境准备清单

动手之前,先把下面的东西准备好:

组件要求说明
操作系统Linux / macOS 优先Windows 也能跑,但 ADB 驱动和路径配置容易折磨人
Python3.10 及以上项目主语言
Android 设备真机或模拟器均可建议先用模拟器,比如 Android Studio 自带的 AVD,操作可回滚
设备调试开启 USB 调试真机还需要关闭"USB 安装监控"等安全拦截
硬件显存 12GB 以上如果你本地推理多模态模型,这是最低门槛;否则用 API
工具链Android SDK Platform-Tools提供 adb、uiautomator 命令

ARTEMIS 的模型端有两条路可选:一是接入云端的多模态大模型 API,配置简单,适合快速验证;二是本地部署开源权重模型,隐私性好,但需要较充足的显存。我个人建议第一次跑通用云端 API,把精力集中在熟悉框架流程上,等你自己改二开的时候再上本地模型。

3.2 初始化项目与连接设备

项目拉下来之后,核心操作就两件事:连上设备,确认 adb 能看到你的 Android 设备:

adb devices

正常会出现类似:

emulator-5554 device

如果显示 unauthorized,说明设备上的 USB 调试授权弹窗没点允许;如果什么都不显示,多半是驱动问题,macOS 上还需要在系统设置里允许终端访问 ADB。

3.3 配置模型 API

在项目配置文件中填入你的模型 API Key 和模型名称。这里提醒一句:不同模型对本任务的遵守能力差异巨大。有些模型 API 会输出格式不稳定的 JSON,甚至把coordinate写成字符串;有些则对"点击某个坐标"这种指令天然敏感。建议第一次直接用项目 README 里写明"验证可用"的默认模型,跑通之后再尝试替换其他模型。

3.4 跑一个简单任务:打开相机拍一张照片

给 Agent 的任务描述尽量明确,比如:

"打开相机应用,切换到前置摄像头,拍一张照片,然后返回桌面。"

这个任务有意思的地方在于它涵盖了打开 App、点击按钮、触发快门、按键返回四类动作,但又不至于复杂到让 Agent 一开始就迷路。任务描述应该写清"打开哪个应用"和"最终要达成什么结果",中间的路径细节留白,让模型自己规划。

跑起来之后的日志会像这样:

[Step 1] thought: 用户需要打开相机应用,我先从桌面找到相机图标。 [Step 1] action: tap (540, 1180) -> 点击相机图标 [Step 2] thought: 相机已打开,当前应该是默认的后置摄像头。屏幕上有切换摄像头的按钮,通常在右上角。 [Step 2] action: tap (960, 240) -> 点击切换摄像头按钮 ... [Step 5] action: key_event: BACK [Step 5] task_completed: true

我第一次跑类似任务时最直观的感受是:原来模型的思考过程真的能还原成一个"人在操作手机"的轨迹。它不依赖任何 App 的内部接口,纯粹靠看屏幕理解操作,这一点和传统自动化测试框架是本质不同的。

4. 实测最容易翻车的四个环节:坐标、时序、上下文与系统弹窗

前面说过,框架本身不难,难在稳定。我把自己和身边人跑这类项目时踩过的坑梳理成四类,每一条背后都有对应的排查思路。

4.1 坐标偏移:截图分辨率和控件树不一致

这是第一个高频问题。某些设备开启"显示大小"或"字体大小"调整后,截图像素坐标跟uiautomator输出的坐标会出现比例偏差。你从控件树里拿到一个bounds,转成坐标后去点击,结果点在按钮边缘甚至点到了旁边的广告位。

排查思路是先确认两套坐标系是否一致:用adb shell wm size看物理分辨率,再对比截图文件的实际尺寸。如果不一致,需要做等比换算。ARTEMIS 的坐标归一化逻辑能缓解这个问题,但如果你在国产定制 ROM 上跑,还是要亲自验证一次坐标映射。

4.2 时序问题:页面动画导致动作落到错误的位置

App 里的转场动画、底部弹窗出现动画、列表惯性滚动,都会让"模型看到截图那一刻"和"执行点击那一刻"之间产生时间差。常见表现是:模型分析截图时按钮在屏幕中央,等它执行点击时按钮因为轮播图滚动已经跑到了左边,结果点了一个完全无关的地方。

缓解办法有两个方向。一是给动作执行后加长等待,比如点击后固定等 1~2 秒再截图;二是做"动作前细看"——执行点击前对目标区域再做一次放大识别,或者直接等到控件树里出现目标控件再出手。后者对时序问题的改善更明显,但会增加延迟。

4.3 上下文污染:长任务做到后面,模型"忘记"前半段

当一个任务超过十步时,模型的上下文里塞满了历史截图描述和思考链。问题在于,早期识别的一些信息,比如"联系人列表第三行是目标",在列表刷新后可能彻底失效。模型如果还抱着旧信息不放,就会反复去点一个已经不存在的位置。

这个问题的处理思路是给历史信息做"时间衰减":只保留最近 3~5 轮的动作和思考,更早的信息做摘要,而不是全量塞进上下文。同时,在执行关键动作之后,让模型重新确认"当前页面是否符合预期",如果不符就回溯。ARTEMIS 这类框架默认保留全部 history,我在二开时通常会改成滑动窗口式上下文,实测对长任务成功率提升非常明显。

4.4 系统弹窗拦截:权限框、更新提示、垃圾通知把任务带偏

真实手机上,你刚打开一个 App,可能弹出一个"允许获取定位?"的权限框,也可能跳出"发现新版本"的更新浮层。这些弹窗对普通用户来说是干扰,对 Agent 来说同样是干扰。模型如果没见过这种弹窗,可能直接困惑,或者更糟——乱点一气把弹窗点掉了然后又点错地方。

处理这类弹窗有两个层次。第一层是"预判法":环境准备阶段就把目标 App 的权限全部授予、关闭通知、关闭自动更新,从源头减少弹窗。第二层是"应对法":在感知层加入一个弹窗识别器,如果检测到系统级弹窗,先执行固定策略,比如点击"拒绝"或"关闭",而不是让模型自由发挥。框架层面通常不会自动处理这个问题,需要你自己在任务循环里加一层"弹窗守卫"。

5. 和 Appium、UIAutomator 这些老方案比,ARTEMIS 的优势在哪

聊完实操细节,有必要退一步,把 ARTEMIS 放到移动自动化的谱系里做个对比。很多测试工程师是带着"这玩意儿能不能替代我手上的框架"的疑问来看它的。

5.1 从"API 驱动"到"视觉驱动"的范式变化

传统自动化方案,比如 Appium、UIAutomator、Espresso,都有一个共同前提:你按控件 ID、类名、文本去定位元素。这套方案在你自己开发的 App 上完全没问题,因为你知道每个控件的 ID 叫什么。但换个场景就尴尬了:你手里是一个没有源码的第三方 App,元素 ID 完全不可控,或者 App 强制走 Flutter、游戏引擎渲染,原生控件树里什么都拿不到。

ARTEMIS 走的是另一条路:它不关心控件有没有 ID,只关心模型从截图上"看到"了什么。本质上,它把"元素定位"这一步从编程问题变成了视觉理解问题。对纯代码渲染的画布类应用,传统方案基本缴械,ARTEMIS 反而能靠截图轻松上手。

5.2 跨 App 任务能力

只看单 App 自动化,ARTEMIS 不一定比传统方案快;但一旦任务需要跨多个应用协同,比如"从相册挑一张图发到微信朋友圈AGENT"修改为"从相册挑一张图发到微信朋友圈",传统方案就非常痛苦——每个 App 都要写一套定位逻辑,App 之间切换状态还要自己管理。这类框架的定位设计天然适合跨 App 场景:模型在截图之间自由切换,不受控件 ID 跨 App 失效的约束。

5.3 各自的地盘,不是谁取代谁

不过要说明白,ARTEMIS 目前还不能无缝替代传统测试框架。它的动作执行延迟通常是秒级,模型每次决策都要经过一轮视觉推理;而 UIAutomator 执行一个点击是毫秒级。如果你的核心诉求是每天跑几千条回归用例,要求快速、稳定、低延迟,传统框架依然是正解。

我的建议是分场景对待:

维度Appium / UIAutomatorARTEMIS 这类智能体框架
元素定位方式控件 ID / 文本 / XPath视觉理解 + 结构化动作
适合场景高频回归、批量接口验证探索式测试、跨 App 任务、不可控 Ui 结构
执行速度快,毫秒到秒级慢,单步需 1~3 秒推理
稳定性极高,可重复受模型能力影响,需大量调优
维护成本App 改版后需更新定位器App 改版后多数情况仍能工作
上手门槛需要编程基础自然语言描述任务即可

6. 从 Demo 到实战:ARTEMIS 能延展到的三个方向

跑通一个 Demo 只是开始。站在我的角度,ARTEMIS 这类框架真正的想象空间在这几个地方,而且都和"让 AI 从聊天框走向真实世界"这个主线有关。

6.1 自动化测试的"自然语言用例"

测试团队以后写用例可能不再需要关心元素定位细节了,而是用一段自然语言描述预期流程:"新用户首次打开 App 时应出现引导页,点击跳过进入首页,首页底部应有 4 个 Tab。"Agent 负责把这句话翻译成一系列视觉验证。这样做的好处是业务同学也能评审用例,测试和产品之间的沟通成本会下降很多。

当然,目前还需要一个人来做"验收":Agent 跑完流程后,你需要确认它确实点击了正确位置,而不是在错误的道路上完成了错误的闭环。这提醒我们,这类框架短期内是测试人员的辅助工具,而不是替代。

6.2 个人自动化助手

ARTEMIS 的底座能力是"看屏幕、想一步、点一步",这恰恰是所有个人手机助手的公共底层模块。你可以基于它做更上层的应用,比如定时任务助手、App 巡检工具、无障碍辅助工具。有些开发者把它和本地大模型组合,做成完全离线运行的手机操作助手,数据不出本机,这个组合我个人非常看好。

6.3 智能体反馈数据的采集器

最后说一个很多人没注意到的价值:ARTEMIS 天然是一个"人机交互行为数据采集器"。它在每一步都会记录截图、思考、动作、结果,这些日志本身就是训练下一代端侧模型的高质量语料。如果你在做 Agent 相关的数据工程,这类框架产出的结构化轨迹数据比从网上扒的纯文本数据有价值得多。

我个人在实际跑这类项目时最深的一个体会是:别指望第一天就让模型完成一个 20 步的长任务。先给它一个三步的短任务,跑通;再加一个分支逻辑,跑通;再上真机、换模型、改上下文窗口。每一步都以"稳定复现"为验收标准,比一上来就追求宏大效果要可靠得多。ARTEMIS 这个项目还在快速迭代,社区里每天都有新的踩坑案例和二次开发方案,保持跟进,你会看到它带来的变化比想象中更快。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询