让你的旧手机变成AI智能体。用自然语言告诉它目标,它会自动完成点击、输入和滑动操作。
下载安卓 APK | 中文官网 | Discord 社区
我想把旧安卓设备变成AI智能体。花了一些时间逆向工程无障碍服务并配置 Tailscale... 成功了。
可以这样理解 — 以前我们用预定义流程来自动化安卓操作。现在想象一下这个自动化层有一个 LLM 大脑。它能读取任何屏幕、理解当前状态、决定做什么并执行。你不需要 API、不需要构建集成。只需安装你喜欢的 App,告诉智能体你想完成什么。
现在它最酷的功能是:可以调用手机上的 ChatGPT、Gemini 或 Google 搜索... 然后把结果带回来。这些服务不需要 API 密钥 — 它就像人类一样使用这些 App。
$ bun run src/kernel.ts
输入你的目标:打开微信,给张三发"你好"
--- 步骤 1/30 ---
思考:我在主屏幕,启动微信。
操作:启动 (842ms)
--- 步骤 2/30 ---
思考:微信已打开,点击搜索图标。
操作:点击 (623ms)
--- 步骤 3/30 ---
思考:搜索框已聚焦。
操作:输入"张三" (501ms)
--- 步骤 4/30 ---
操作:回车 (389ms)
--- 步骤 5/30 ---
思考:找到张三了,点击进入聊天。
操作:点击 (412ms)
--- 步骤 6/30 ---
思考:进入聊天窗口,在输入框输入文字。
操作:点击输入框 (234ms)
操作:输入"你好" (300ms)
--- 步骤 7/30 ---
思考:点击发送按钮。
操作:点击发送 (200ms)
操作:完成 (150ms)
核心原理很简单 — 一个 感知 → 推理 → 行动 的循环,持续重复直到目标完成(或达到步数上限)。
┌─────────────────────────────────────────┐
│ 你的目标 │
│ "给微信好友张三发消息说你好" │
└────────────────┬────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ │
│ ┌──────────────┐ │
│ │ 1. 感知 │ │
│ └──────┬───────┘ │
│ │ │
│ 通过 ADB 转储无障碍树 │
│ 解析 XML → 可交互 UI 元素 │
│ 与前一个屏幕对比(检测变化) │
│ 可选:截取屏幕截图 │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 2. 推理 │ │
│ └──────┬───────┘ │
│ │ │
│ 发送屏幕状态 + 目标 + 历史给 LLM │
│ LLM 返回 { 思考, 计划, 行动 } │
│ "我看到搜索图标在 (890, 156)。 │
│ 我应该点击它。" │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 3. 行动 │ │
│ └──────┬───────┘ │
│ │ │
│ 通过 ADB 执行:点击、输入、滑动等 │
│ 下一步把结果反馈给 LLM │
│ 检查目标是否完成 │
│ │ │
│ ▼ │
│ 完成了? ── 是 ──→ 退出 │
│ │ │
│ 否 │
│ │ │
│ └─────── 循环回感知 │
│ │
└─────────────────────────────────────┘
LLM 控制 UI 听起来很脆弱。如果不处理失败模式,确实会崩溃。以下是 uclaw 的处理方式:
- 卡住循环检测 — 如果屏幕 3 步没有变化,会注入恢复提示
- 重复操作追踪 — 滑动窗口追踪最近操作,即使跨屏幕变化也能捕捉重试循环
- 漂移检测 — 如果智能体连续发送导航操作(滑动、返回、等待)但不交互任何东西,会被提示直接操作
- 视觉备选 — 当无障碍树为空时(webviews、Flutter App、游戏),发送截图给 LLM
- 操作反馈 — 每个操作结果(成功/失败 + 消息)在下一步反馈给 LLM
- 多轮记忆 — 保持跨步骤的对话历史
curl -fsSL https://uclaw.cc/install.sh | sh前置要求:
# 安装 ADB
# macOS:
brew install android-platform-tools
# Linux:
sudo apt install android-tools-adb
# 安装 Bun(必须)
curl -fsSL https://bun.sh/install | bash
# 克隆和设置
git clone https://github.com/unitedbyai/droidclaw.git
cd droidclaw
bun install
cp .env.example .env编辑 .env,最快方式是 groq(免费额度):
LLM_PROVIDER=groq
GROQ_API_KEY=***
# 或用 ollama 完全本地运行(无需 API)
ollama pull llama3.2
# 然后在 .env 设置:
LLM_PROVIDER=ollama
OLLAMA_MODEL=llama3.2- 进入 设置 → 关于手机 → 点击"版本号"7次 开启开发者选项
- 进入 设置 → 开发者选项 → 开启"USB 调试"
- 通过 USB 连接并点击"允许"
adb devices # 应该显示你的设备bun run src/kernel.ts
# 输入你的目标并回车输入你想要完成的任务:
bun run src/kernel.ts
# 输入你的目标:打开设置并开启深色模式工作流是 JSON 文件,描述子目标的序列。每步可以切换到不同 App。
bun run src/kernel.ts --workflow examples/workflows/wechat-send-message.json对于不需要 AI 的任务 — 固定的点击和输入序列。无 LLM 调用,即时执行。
bun run src/kernel.ts --flow examples/flows/wechat-flow.yamlwechat-send-message.json- 发送微信消息wechat-send-moment.json- 发朋友圈wechat-pay.json- 微信支付
alipay-transfer.json- 转账alipay-scan-pay.json- 扫码支付
meituan-order.json- 点外卖ele-order.json- 饿了么下单
douyin-post.json- 发布视频kuaishou-post.json- 发快手
- 查快递、查天气、查股票、设置闹钟...
整个智能体约 10 个文件:
src/
├── kernel.ts 主循环:感知 → 推理 → 行动
├── actions.ts 22 个动作实现(点击、输入、滑动等)
├── skills.ts 6 个多步技能(读屏、发消息等)
├── workflow.ts 工作流编排引擎
├── flow.ts YAML 流程运行器
├── llm-providers.ts 5 个提供商 + 系统提示词
├── sanitizer.ts 无障碍 XML 解析器
├── config.ts 环境配置
├── constants.ts 按键码、滑动坐标
└── logger.ts 会话日志
默认设置是通过 USB — 手机插在电脑上。但你可以更进一步。
在手机和电脑上都安装 Tailscale,一旦它们在同一个 tailnet 上,就可以网络连接 ADB:
# 在手机上:开启无线调试
# 设置 → 开发者选项 → 无线调试
# 记下显示的 IP:端口
# 从世界任何地方:
adb connect <手机-Tailscale-IP>:<端口>
adb devices # 应该显示你的手机
bun run src/kernel.ts现在你的手机是一个远程 AI 智能体。放在桌上插着电源,从 VPS、咖啡馆的笔记本或每天早上 8 点运行工作流的定时任务来控制它。
bun run src/kernel.ts # 交互模式
bun run src/kernel.ts --workflow file.json # 运行工作流
bun run src/kernel.ts --flow file.yaml # 运行流程
bun install # 安装依赖
bun run build # 编译"adb: command not found" — 安装 adb(macOS 上 brew install android-platform-tools)或在 .env 中设置 ADB_PATH。
"no devices found" — 确保 USB 调试已开启,手机上已点击"允许",数据线支持数据传输(不只是充电)。
智能体重复同一操作 — 卡住检测应该自动处理。如果持续,尝试更强的模型。
空无障碍树 — 某些 App(Flutter、webviews、游戏)不暴露无障碍信息。在 .env 中设置 VISION_MODE=always。
由 unitedby.ai 构建 — 开放的 AI 社区
MIT
中文站: uclaw.cc