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两个变量即可。如果你用的是Geminiprovider填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_providergemini, device_serialyour_device_serial, max_steps30 ) 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协议扩展能力边界MCPModel Context Protocol是最近很火的一个协议用于让AI模型连接外部工具和数据源。ARTEMIS理论上可以作为MCP的一个执行端接收MCP Server下发的任务在移动端执行。这个方向目前还没有成熟的实现但思路是清晰的MCP负责协调和调度ARTEMIS负责在手机上落地。如果你对MCP感兴趣可以关注ARTEMIS的issue区已经有开发者在讨论这个集成方案了。我在实际使用ARTEMIS的过程中最大的体会是移动端自动化的门槛正在快速降低。以前需要专门团队维护的自动化流程现在一个开发者用自然语言就能描述和运行。当然它还不是银弹复杂场景下仍然需要人工干预和调优。但方向是对的而且开源社区的迭代速度很快值得持续关注。如果你手头有重复性的手机操作任务不妨花一个下午把ARTEMIS跑起来亲自感受一下AI操作手机的实际效果。