使用 longarm 批处理任务运行可复用的 Android 工作流
- Metaphor Projects
- 应用
- 06 Jul, 2026
longarm 现已支持批处理任务,也就是可保存、可一次执行多个动作的 Android 自动化流程。
你不再需要为每一次点击、延时、启动应用或截图分别发送请求,而是可以把这些步骤组合成一个具名任务。你可以在设备上的 Batch 标签页中运行它,也可以从脚本通过 HTTP API 触发,或者让兼容 MCP 的 AI Agent 以工具形式列出、保存、运行并检查批处理任务。

批处理任务带来了什么
longarm 的第一个版本专注于直接远程控制:启动本地 HTTP 服务器、发送一个手势请求、截取一张屏幕图像,并让设备在桌面工作流中保持可见。
批处理任务让这种控制方式变得可复用。
一个批处理任务可以包含:
- 点击、长按、滑动、捏合、旋转和双指滑动
- 步骤之间的延时
- 执行过程中的截图
- 按 Android 包名启动应用
- 用于更深入应用或系统流程的 Android Intent
- 用于在多个步骤中复用值的变量
- 用于重复子步骤的循环
这意味着有用的单位不再只是“点击这个坐标”,而可以是“打开这个应用,等待加载,滚动内容流,截取结果,然后保留一次运行记录”。
面向真实工作流
当同一个 Android 流程需要重复执行很多次时,批处理任务会很有用:
- 每次应用构建后采集相同的一组截图
- 在真实设备上执行一次 QA 冒烟测试
- 在人工测试前打开目标应用并将其置于已知状态
- 自动化那些对设备过于依赖、难以在模拟器中完成的准备步骤
- 给 AI Agent 一个更高层级的动作,而不是大量脆弱的单独手势
每次运行都会记录到历史中,包含状态、进度、消息以及采集到的截图。任务以异步方式启动,并返回一个 runId,因此脚本和智能体可以轮询历史,而无需长时间保持 HTTP 请求处于打开状态。
同一时间只能运行一个批处理任务。如果已经有其他任务在执行,longarm 会返回冲突,而不是把两个自动化流程混在同一块屏幕上执行。
从应用、HTTP 或 MCP 运行
Batch 标签页是在设备上直接创建和运行任务的最简单方式。它适合先把一个流程搭建好、命名,然后在之后反复回放。
当任务属于桌面脚本、CI 辅助工具或本地自动化工具的一部分时,HTTP API 更合适。你可以通过 /api/batch 创建已保存任务,通过 /api/batch/<id>/run 运行一个已保存任务,或者通过 /api/batch/run 立即执行一个内联任务。
MCP 服务器则将同样的概念暴露给 AI Agent。batch_list、batch_save、batch_run、batch_run_inline、batch_status 和 batch_history_get 等工具让智能体能够直接处理完整的 Android 工作流,而不必手动拼接每一个底层屏幕操作。
一个简短的 Python 示例
下面的示例会启动一个内联批处理任务:打开 Android 设置,等待其加载,截取一张屏幕图像,并持续查询运行历史直到任务结束。
请将 BASE_URL 替换为 longarm 中显示的地址。如果你的服务器使用认证令牌,请将 TOKEN 替换为应用中显示的令牌。
import time
import requests
BASE_URL = "http://192.168.1.10:8080"
TOKEN = "secret"
headers = {
"Authorization": f"Bearer {TOKEN}",
"Content-Type": "application/json",
}
task = {
"name": "Open Settings and capture",
"steps": [
{
"type": "open_app",
"params": {"packageName": "com.android.settings"},
"delayAfterMs": 2000,
},
{
"type": "screenshot",
"params": {"scale": 1},
},
],
}
run = requests.post(
f"{BASE_URL}/api/batch/run",
headers=headers,
json=task,
timeout=10,
).json()
run_id = run["runId"]
print("started", run_id)
while True:
history = requests.get(
f"{BASE_URL}/api/batch/history/{run_id}",
headers=headers,
timeout=10,
).json()
print(history["status"], history.get("message", ""))
if history["status"] != "processing":
break
time.sleep(1)
当运行结束后,历史记录会包含进度信息,以及任务过程中捕获的所有截图引用。启用 longarm Plus 后,还可以通过历史接口下载截图文件并导出 zip 压缩包。
为什么这很重要
真实设备自动化之所以常常变得脆弱,是因为每个脚本都要重新发现同样的准备步骤。批处理任务把这些步骤移得更靠近设备本身,并为它们提供稳定的名称、运行历史,以及通过 HTTP 和 MCP 提供的远程控制接口。
这让 longarm 更适合日常 Android 自动化工作:一个流程只需构建一次,就可以从你工作的任何地方反复执行,同时还保留足够清晰的结果以便调试。