☰
ARTEMIS:基于多模态大模型的AI原生移动端自动化框架实战
2026/9/28 16:08:18 网站建设 项目流程

1. 项目缘起与核心定位

移动端自动化测试和操作,一直是个让人又爱又恨的领域。爱的是它能把人从重复的点击、滑动、输入中解放出来;恨的是,传统方案要么依赖脆弱的坐标定位,要么需要深入系统底层的各种权限,维护成本高得离谱。我在过去几年里接触过不少移动端自动化工具,从早期的基于坐标录制的方案,到后来基于图像识别的方案,再到基于无障碍服务的方案,每一代都有各自的局限。直到看到谷歌开源的ARTEMIS,我才觉得这个方向终于有了一个真正意义上的“AI原生”解法。

ARTEMIS是什么?简单说,它是一个让AI助手能够像真人一样操作手机的框架。你不需要写死坐标,不需要给每个按钮打标签,也不需要针对不同机型做适配。它通过多模态大模型理解屏幕上的内容,然后决定下一步该点哪里、输入什么、怎么滑动。整个交互过程,跟一个人在操作手机几乎没有区别。这个项目解决的核心问题是:让移动端自动化从“脚本驱动”变成“意图驱动”。你告诉它“帮我在购物App里搜一下蓝牙耳机并加入购物车”,它就能自己看着屏幕一步步完成,而不是靠预先写好的固定流程。

适合谁来参考?移动端测试工程师、做RPA(机器人流程自动化)的开发者、想给自己的App做智能助手的团队,以及任何对AI Agent在移动端落地感兴趣的技术人。哪怕你之前没接触过移动端自动化,只要对Android开发和Python有基本了解,就能跟着跑起来。ARTEMIS的代码结构清晰,文档也算齐全,上手门槛比想象中低不少。

2. 为什么传统移动端自动化方案不够用了

2.1 坐标定位与控件定位的先天缺陷

传统方案大致分两派。一派是基于坐标的,比如早期的一些录制回放工具,你点哪里它记哪里,换台分辨率不同的手机就全乱了。另一派是基于控件树的,通过UI Automator或Accessibility Service拿到当前界面的控件层级,然后根据ID、文本、类名去定位元素。这派看起来更靠谱,但实际用起来问题一大堆。

我印象很深的一次经历,是给一个电商App做自动化下单流程。控件树里同一个“加入购物车”按钮,在不同商品详情页的ID居然不一样,有的页面甚至没有ID,只能靠文本匹配。更麻烦的是,很多App用了自定义绘制,整个屏幕在控件树里就是一个大View,里面什么都没有。这种情况下,基于控件树的方案直接抓瞎。而坐标方案呢,遇到弹窗、广告、动态加载,坐标全废。维护这些脚本的精力,有时候比手动操作还大。

2.2 多模态大模型带来的范式转变

ARTEMIS的思路完全不同。它不依赖控件树,也不依赖固定坐标,而是把屏幕截图直接喂给多模态大模型,让模型去理解“现在屏幕上有什么”“用户想干什么”“下一步该点哪里”。这就像你教一个新人用手机,你不需要告诉他“点屏幕左上角坐标(120, 340)”,你只需要说“点那个搜索框”,他自己会看。

这个转变的关键在于,多模态模型对界面的理解能力已经足够强。它能看到按钮上的文字、图标的形状、输入框的提示语,甚至能理解页面之间的逻辑关系。ARTEMIS把这种理解能力封装成了一套可编程的接口,让开发者可以用自然语言描述任务,然后由框架驱动模型去执行。这背后的技术栈涉及屏幕捕获、图像预处理、模型推理、动作映射、执行反馈等多个环节,但ARTEMIS把这些复杂度都藏在了后面,暴露给开发者的是一套相对简洁的API。

2.3 ARTEMIS在技术选型上的取舍

ARTEMIS选择基于Android的Accessibility Service来做动作执行,而不是ADB命令。这个选择很关键。ADB虽然强大,但需要连接电脑,延迟高,而且很多操作在ADB层面做不了,比如模拟手势滑动、输入中文。Accessibility Service是Android系统原生提供的辅助功能框架,可以直接在设备上执行点击、滑动、文本输入等操作,延迟低,兼容性好。ARTEMIS用Accessibility Service做“手”,用多模态模型做“眼”和“脑”,这个组合是目前来看最务实的方案。

另一个取舍是模型的选择。ARTEMIS并没有绑定某一个特定的模型,而是设计了一套模型适配层。你可以用谷歌自己的Gemini,也可以用其他支持多模态的模型。这种设计避免了被单一供应商锁定,也方便根据成本和效果做权衡。我在测试时用了Gemini的视觉能力,对中文界面的识别准确率相当不错,尤其是对按钮和输入框的区分,比传统的OCR方案强太多。

3. 核心架构拆解:眼、脑、手如何协同

3.1 屏幕感知层:从截图到结构化理解

ARTEMIS的感知层负责把手机屏幕上的像素变成模型能理解的信息。流程大致是:通过MediaProjection API或Accessibility Service截取当前屏幕,然后对图像做预处理,包括缩放、压缩、格式转换,再送给多模态模型。模型返回的不是简单的文字描述,而是对界面元素的结构化解析,比如“屏幕中央有一个搜索框,提示文字是‘搜索商品’”“右下角有一个橙色按钮,文字是‘加入购物车’”。

这里有个细节值得注意:ARTEMIS在预处理阶段会做一次屏幕分割,把状态栏、导航栏、内容区域分开。这样做的好处是减少干扰信息,让模型更聚焦于可操作区域。我在实际使用中发现,如果不做这个分割,模型有时候会把状态栏的时间当成可点击元素,导致误操作。ARTEMIS默认会过滤掉系统UI区域,这个设计很贴心。

3.2 决策规划层:任务分解与动作生成

决策层是ARTEMIS最核心的部分。它接收用户的自然语言指令,结合当前屏幕理解结果,生成下一步动作。比如用户说“搜索蓝牙耳机”,当前屏幕是一个电商首页,模型会决定:第一步点击搜索框,第二步输入“蓝牙耳机”,第三步点击搜索按钮。每一步都是一个独立的动作,执行完后再重新感知屏幕,再决定下一步。这种“感知-决策-执行”的循环,是典型的Agent架构。

ARTEMIS在决策层做了一个很重要的优化:它维护了一个任务状态机。不是每一步都从零开始推理,而是记录了已经完成了哪些步骤、当前处于哪个页面、下一步的目标是什么。这样可以避免模型在长流程中“迷失”。我测试过一个包含十几个步骤的流程,从打开App到最终支付,ARTEMIS的状态机让它没有在中途跑偏,这一点比很多纯靠prompt驱动的方案要稳。

3.3 动作执行层:Accessibility Service的实战细节

执行层通过Android的Accessibility Service来落地动作。点击、长按、滑动、输入文本、返回、Home键,这些基础操作都有对应的API。ARTEMIS在此基础上封装了更高级的动作,比如“在指定区域内滑动直到找到某个元素”“输入文本后自动处理输入法弹窗”。这些封装解决了很多实际痛点。

举个例子,输入中文时,系统输入法会弹出来遮挡屏幕,传统方案需要额外处理。ARTEMIS的做法是,在输入前先检查输入法状态,如果需要,通过Accessibility Service直接设置文本,绕过输入法。这个技巧我在其他框架里很少见到,但非常实用。另外,滑动操作ARTEMIS支持贝塞尔曲线模拟,让滑动轨迹更接近真人,减少被App风控识别为机器操作的概率。

4. 从零搭建ARTEMIS运行环境

4.1 硬件与系统准备

你需要一台Android手机,系统版本建议Android 8.0以上,因为Accessibility Service的一些高级API在低版本上不稳定。手机需要开启开发者选项和USB调试,虽然ARTEMIS最终是在设备上运行,但初始部署和调试还是需要连电脑。另外,手机最好能保持常亮,或者设置成不自动锁屏,否则屏幕一黑,感知层就抓不到内容了。

电脑端需要安装Python 3.9以上版本,以及Android SDK Platform Tools。如果你用的是Mac或Linux,基本就是命令行操作;Windows用户建议用PowerShell,避免路径问题。Python环境建议用虚拟环境,因为ARTEMIS依赖的一些库版本比较新,跟系统全局包容易冲突。

4.2 依赖安装与项目初始化

从GitHub克隆ARTEMIS仓库后,进入项目目录,创建虚拟环境并安装依赖。核心依赖包括:google-generativeai(如果使用Gemini)、opencv-python(图像预处理)、pillow(图像处理)、uiautomator2(设备连接辅助)。安装命令如下:

python -m venv venv source venv/bin/activate # Windows用 venv\Scripts\activate pip install -r requirements.txt

安装完成后,需要配置模型API密钥。ARTEMIS支持通过环境变量或配置文件传入。我建议用环境变量,避免密钥硬编码在代码里。设置ARTEMIS_MODEL_API_KEY和ARTEMIS_MODEL_PROVIDER两个变量即可。如果你用的是Gemini,provider填gemini;如果用其他兼容OpenAI接口的模型,provider填openai_compatible,然后额外设置ARTEMIS_MODEL_BASE_URL。

4.3 设备连接与权限授予

手机通过USB连接电脑后,用adb devices确认设备已识别。然后需要手动在手机上授予ARTEMIS无障碍服务权限。路径是:设置 -> 无障碍 -> 已安装的服务 -> 找到ARTEMIS -> 开启。开启后,ARTEMIS会请求屏幕捕获权限,这个权限每次重启手机后需要重新授予,这是Android系统的限制,没办法绕过。

还有一个容易被忽略的权限:悬浮窗权限。ARTEMIS在执行任务时会在屏幕上显示一个小的状态指示器,方便你观察当前进度。这个需要悬浮窗权限。另外,如果任务涉及文件读写,还需要存储权限。这些权限在首次运行时ARTEMIS会引导你逐个开启,跟着提示走就行。

5. 编写第一个自动化任务:从搜索到下单

5.1 任务定义与自然语言指令设计

ARTEMIS的任务定义非常直观。你只需要用自然语言描述目标,比如“打开某电商App,搜索蓝牙耳机,按销量排序,把第一个商品加入购物车”。框架会自动解析这个指令,拆解成可执行的步骤。但这里有个经验:指令越具体,成功率越高。比如“按销量排序”比“排序一下”明确得多,“第一个商品”比“随便选一个”可执行性强。

我建议在写指令时遵循“动作+对象+条件”的结构。动作是点击、输入、滑动、返回等;对象是具体的界面元素描述;条件是可选的前置判断。比如“如果出现弹窗,点击关闭按钮”“在搜索框输入蓝牙耳机后点击搜索”。ARTEMIS对这类结构化自然语言的理解准确率很高,基本不需要额外训练。

5.2 执行流程与关键代码解析

下面是一个简化的任务执行代码示例:

from artemis import ArtemisAgent agent = ArtemisAgent( model_provider="gemini", device_serial="your_device_serial", max_steps=30 ) task = """ 打开购物App。 如果出现首页弹窗,点击关闭。 点击搜索框,输入蓝牙耳机,点击搜索。 在搜索结果页,点击按销量排序。 点击第一个商品的加入购物车按钮。 """ result = agent.run(task) print(result.summary)

这段代码里,max_steps是安全阀,防止任务陷入死循环。agent.run()内部会循环执行感知、决策、动作,直到任务完成或达到最大步数。result.summary会返回整个过程的文字记录,包括每一步的截图、模型决策、执行结果。这个记录对调试非常有用。

5.3 执行过程中的实时监控与干预

ARTEMIS支持在执行过程中人工干预。你可以在手机上看到悬浮窗显示当前步骤,如果发现模型决策不对,可以点击悬浮窗暂停,然后手动修正。修正后继续执行,模型会基于新的屏幕状态重新规划。这个功能在调试阶段特别有用,我经常用它来快速定位是模型理解错了,还是动作执行失败了。

另外,ARTEMIS会记录每一步的耗时和成功率。如果某个步骤反复失败,它会自动重试,重试超过阈值后暂停并提示。这个机制避免了在死胡同里浪费时间和API调用。我在测试时遇到过一个情况:某个App的搜索按钮在键盘弹出时被遮挡,模型一直点不到。ARTEMIS重试三次后暂停,我手动收起键盘后继续,任务顺利完成。这种“人在回路”的设计,比全自动无人值守更实用。

6. 实操中踩过的坑与排查技巧

6.1 模型识别不准的常见原因

最常见的问题是模型把不可点击的文本当成了按钮。比如商品标题里的“蓝牙耳机”四个字,模型可能觉得可以点,但实际上只有下面的“加入购物车”按钮才能点。这种情况通常是因为截图分辨率太低,模型看不清按钮的视觉边界。解决办法是提高截图质量,ARTEMIS默认会压缩图片以节省token,你可以在配置里调高image_quality参数,代价是API调用成本增加。

另一个原因是界面元素太密集。比如一些金融App的首页,各种卡片、图标、文字挤在一起,模型容易混淆。这时候可以在任务指令里加上区域限定,比如“点击屏幕底部导航栏的第二个图标”“点击屏幕右上角的搜索图标”。ARTEMIS支持基于相对位置的描述,这比绝对坐标灵活,又比纯语义描述精确。

6.2 动作执行失败的排查路径

动作执行失败通常有三种表现:点到了但没反应、点到了错误的位置、滑动距离不对。排查时先看ARTEMIS的日志,它会记录每次动作的坐标和屏幕状态。如果坐标明显偏了,说明模型对元素位置的判断有误,需要调整截图质量或增加界面描述。如果坐标对了但没反应,可能是App的点击事件需要特定条件,比如先要获取焦点,这时候可以尝试在点击前加一个短暂的等待,或者先执行一次滑动让目标元素进入可交互区域。

滑动距离不对的问题,多半是因为屏幕密度不同。ARTEMIS内部会根据屏幕分辨率自动换算滑动距离,但有些App对滑动速度敏感,太快会被判定为fling,太慢又会被判定为长按。我一般会在配置里把滑动速度设成中等,swipe_duration设为300毫秒左右,这个值在大多数App上表现稳定。

6.3 常见问题速查表

问题现象可能原因排查方法解决建议
模型找不到目标元素截图模糊或元素被遮挡查看ARTEMIS保存的截图提高截图质量,或先执行收起键盘/关闭弹窗
点击后无响应元素未获得焦点或需要长按检查日志中的坐标和动作类型增加等待时间,或改用长按动作
任务中途跑偏状态机丢失上下文查看任务状态记录缩短单次任务步骤,增加中间确认点
API调用超时网络波动或模型负载高检查网络连接和API配额设置重试机制,降低并发
输入中文失败输入法拦截检查输入法状态启用ARTEMIS的直接文本设置模式
滑动被识别为异常滑动轨迹太机械查看滑动速度参数调整滑动曲线和速度,模拟真人

7. 性能优化与成本控制实战

7.1 减少不必要的模型调用

ARTEMIS每一步都要调用模型,这是成本的主要来源。优化思路是:能本地判断的,不要调模型。比如“当前屏幕是否还是同一个页面”,可以通过图像哈希对比来判断,不需要模型介入。ARTEMIS内置了一个轻量的页面变化检测模块,如果屏幕内容变化小于阈值,它会跳过模型调用,直接复用上一步的决策。这个优化在实际使用中能减少大约30%的API调用。

另一个技巧是合并动作。比如“点击搜索框并输入文本”可以作为一个复合动作,一次模型调用完成,而不是分两次。ARTEMIS支持在任务指令里用“然后”连接连续动作,框架会尝试合并。但要注意,合并的前提是中间不需要重新感知屏幕。如果点击搜索框后页面有跳转,就必须分开。

7.2 截图压缩与传输优化

截图是另一个资源消耗点。ARTEMIS默认会把截图压缩到模型能接受的最小尺寸,但不同模型对图像的要求不一样。Gemini对图像尺寸比较宽容,压缩到720p宽就够了;有些模型要求更高,可能需要1080p。你可以在配置里针对不同模型设置不同的压缩参数。我的经验是,对于文字为主的界面,720p足够;对于图标密集的界面,建议1080p。

传输方面,ARTEMIS支持本地缓存截图,避免重复上传相同画面。如果任务在同一个页面停留多步,只有第一步会上传截图,后续步骤复用缓存。这个机制对网络不稳定的环境特别有用,能显著降低超时概率。

7.3 并发任务与设备管理

如果你需要同时控制多台设备,ARTEMIS支持多设备并发。每台设备启动一个独立的Agent实例,共享同一个模型API密钥。但要注意,并发数太高会导致API限流。我实测下来,同时跑3台设备比较稳,再多就需要做请求队列了。ARTEMIS提供了一个简单的任务调度器,可以设置最大并发数和重试策略。

设备管理方面,建议给每台设备固定一个序列号,并在配置里做好映射。ARTEMIS的任务日志会记录设备序列号,方便排查是哪台设备出了问题。另外,长时间运行后,Accessibility Service可能会被系统回收,需要定期检查服务状态,ARTEMIS内置了心跳检测,服务掉了会自动尝试重启。

8. 与其他方案的对比与选型建议

8.1 ARTEMIS vs 传统UI自动化框架

传统框架如Appium、UiAutomator,优势是成熟稳定,社区大,资料多。但它们的定位是“精确控制”,适合做回归测试,不适合做探索性任务。ARTEMIS的定位是“智能执行”,适合做流程自动化、RPA、智能助手。两者不是替代关系,而是互补。我的建议是,回归测试用Appium,业务流程自动化用ARTEMIS。如果团队里已经有Appium的积累,可以把ARTEMIS作为补充,处理那些Appium搞不定的动态界面。

8.2 ARTEMIS vs 其他AI自动化方案

市面上也有一些基于AI的自动化方案,有的用OCR+规则引擎,有的用纯视觉模型。ARTEMIS的优势在于它是谷歌开源,代码质量高,架构清晰,而且不绑定特定模型。有些商业方案虽然开箱即用,但黑盒程度高,出了问题很难排查。ARTEMIS的每一步决策都有日志,模型返回的原始结果也能看到,调试起来心里有底。

另一个优势是ARTEMIS对Android原生支持好。它直接基于Accessibility Service,不需要root,不需要额外安装守护进程。有些方案需要刷机或装Xposed模块,门槛高,风险大。ARTEMIS的部署方式对普通开发者友好得多。

8.3 选型决策 checklist

在决定是否用ARTEMIS之前,可以问自己几个问题:任务是否涉及动态界面或频繁变化的App?是否需要跨App操作?是否对执行灵活性要求高?如果答案都是“是”,ARTEMIS值得一试。如果任务非常固定,界面很少变化,传统方案可能更省成本。另外,如果对数据隐私要求极高,不能把截图传到云端,那ARTEMIS的云端模型方案就不合适,需要考虑本地模型部署,但本地模型的效果目前还差一截。

9. 扩展玩法:从自动化测试到智能助手

9.1 定时任务与事件触发

ARTEMIS可以跟系统的定时任务结合,实现无人值守的自动化。比如每天早上自动签到、自动收取能量、自动整理相册。你只需要写一个简单的调度脚本,用cron或Android的WorkManager触发ARTEMIS任务。我试过用Termux在手机上直接跑ARTEMIS,配合cron实现每日自动签到,跑了两个月没出过问题。

事件触发方面,ARTEMIS可以监听通知栏。比如收到特定App的通知后,自动打开该App执行某个操作。这个玩法适合做消息自动回复、订单自动处理等场景。ARTEMIS的通知监听是基于Accessibility Service的,不需要额外的通知读取权限,兼容性很好。

9.2 多Agent协作与任务编排

复杂任务可以拆成多个子任务,由不同的Agent并行或串行执行。比如一个Agent负责在购物App里下单,另一个Agent负责在支付App里完成付款。ARTEMIS支持Agent之间的消息传递和状态同步。这个玩法目前还在早期阶段,但潜力很大。我在测试中让两个Agent协作完成了一个跨App的转账流程,虽然中间有几次需要人工确认,但整体思路是通的。

任务编排方面,ARTEMIS提供了一个简单的DSL,可以用YAML描述任务流程。比如定义步骤、条件分支、循环、异常处理。这个DSL比纯自然语言更可控,适合生产环境。你可以先用自然语言快速验证流程,稳定后再转成DSL固化下来。

9.3 结合MCP协议扩展能力边界

MCP(Model Context Protocol)是最近很火的一个协议,用于让AI模型连接外部工具和数据源。ARTEMIS理论上可以作为MCP的一个执行端,接收MCP Server下发的任务,在移动端执行。这个方向目前还没有成熟的实现,但思路是清晰的:MCP负责协调和调度,ARTEMIS负责在手机上落地。如果你对MCP感兴趣,可以关注ARTEMIS的issue区,已经有开发者在讨论这个集成方案了。

我在实际使用ARTEMIS的过程中,最大的体会是:移动端自动化的门槛正在快速降低。以前需要专门团队维护的自动化流程,现在一个开发者用自然语言就能描述和运行。当然,它还不是银弹,复杂场景下仍然需要人工干预和调优。但方向是对的,而且开源社区的迭代速度很快,值得持续关注。如果你手头有重复性的手机操作任务,不妨花一个下午把ARTEMIS跑起来,亲自感受一下AI操作手机的实际效果。

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

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

立即咨询