--- url: /zh/android-api-reference.md --- # API 参考(Android) 当你需要自定义设备行为、把 Midscene 接入框架,或排查 adb 问题时,请查阅本节。关于通用构造函数(报告、Hook、缓存等)的参数说明,请参考平台无关的 [API 参考](./api)。 ## Action Space(动作空间) `AndroidDevice` 使用以下动作空间,Midscene Agent 在规划任务时可以使用这些操作: - `Tap` —— 点击元素。 - `DoubleClick` —— 双击元素。 - `Input` —— 输入文本,支持 `replace`/`append`/`clear` 模式,可选 `autoDismissKeyboard`。 - `Scroll` —— 以元素为起点或从屏幕中央向上/下/左/右滚动,支持滚动到顶/底/左/右。 - `DragAndDrop` —— 从一个元素拖拽到另一个元素。 - `KeyboardPress` —— 按下指定键位。 - `LongPress` —— 长按目标元素,可选自定义时长。 - `PullGesture` —— 上拉或下拉(如下拉刷新),可选距离与持续时间。 - `ClearInput` —— 清空输入框内容。 - `Launch` —— 打开网页或 `package/.Activity`。 - `RunAdbShell` —— 执行原始 `adb shell` 命令。 - `AndroidBackButton` —— 触发系统返回。 - `AndroidHomeButton` —— 回到桌面。 - `AndroidRecentAppsButton` —— 打开多任务/最近应用。 ## AndroidDevice {#androiddevice} 创建一个可供 AndroidAgent 驱动的 adb 设备实例。 ### 导入 ```ts import { AndroidDevice, getConnectedDevices } from '@midscene/android'; ``` ### 构造函数 ```ts const device = new AndroidDevice(deviceId, { // 设备参数... }); ``` ### 设备选项 - `deviceId: string` —— 来自 `adb devices` 或 `getConnectedDevices()` 的值。 - `autoDismissKeyboard?: boolean` —— 输入完成后自动隐藏键盘,默认 `true`。 - `keyboardDismissStrategy?: 'esc-first' | 'back-first'` —— 关闭键盘的顺序,默认 `'esc-first'`。 - `androidAdbPath?: string` —— adb 可执行文件的自定义路径。 - `remoteAdbHost?: string` / `remoteAdbPort?: number` —— 指向远程 adb server。 - `imeStrategy?: 'always-yadb' | 'yadb-for-non-ascii'` —— 控制何时调用 [yadb](https://github.com/ysbing/YADB) 进行文本输入,默认 `'yadb-for-non-ascii'`。 - `displayId?: number` —— 在设备镜像多个屏幕时,选择特定虚拟屏幕。 - `screenshotResizeScale?: number` —— 在发送给模型前对截图进行缩放,默认 `1 / devicePixelRatio`。 - `alwaysRefreshScreenInfo?: boolean` —— 每一步都重新查询旋转角度与屏幕尺寸,默认 `false`。 ### 使用说明 - 可以使用 `getConnectedDevices()` 发现设备,`udid` 与 `adb devices` 输出一致。 - 可以使用 `remoteAdbHost/remoteAdbPort` 连接远程 adb;如果 adb 不在 PATH 中,可设置 `androidAdbPath`。 ### 示例 #### 快速开始 ```ts import { AndroidAgent, AndroidDevice, getConnectedDevices } from '@midscene/android'; const [first] = await getConnectedDevices(); const device = new AndroidDevice(first.udid); await device.connect(); const agent = new AndroidAgent(device, { aiActionContext: 'If a permissions dialog appears, accept it.', }); await agent.launch('https://www.ebay.com'); await agent.aiAct('search "Headphones" and wait for results'); const items = await agent.aiQuery( '{itemTitle: string, price: number}[], find item in list and corresponding price', ); console.log(items); ``` #### 启动原生 App ```ts await agent.launch('com.android.settings/.Settings'); await agent.back(); await agent.home(); ``` ## AndroidAgent {#androidagent} 将 Midscene 的 AI 规划能力绑定到 AndroidDevice,实现 UI 自动化。 ### 导入 ```ts import { AndroidAgent } from '@midscene/android'; ``` ### 构造函数 ```ts const agent = new AndroidAgent(device, { // 通用 Agent 参数... }); ``` ### Android 特有选项 - `customActions?: DeviceAction[]` —— 通过 `defineAction` 扩展规划器的可用动作。 - `appNameMapping?: Record` —— 将友好的应用名称映射到包名。当你在 `launch(target)` 里传入应用名称时,Agent 会在此映射中查找对应的包名;若未找到映射,则按原样尝试启动 `target`。 - 其余字段与 [API constructors](./api#common-parameters) 一致:`generateReport`、`reportFileName`、`aiActionContext`、`modelConfig`、`cacheId`、`createOpenAIClient`、`onTaskStartTip` 等。 ### 使用说明 :::info - 一个设备连接对应一个 Agent。 - `launch`、`runAdbShell` 等 Android 专属辅助函数也可在 YAML 脚本中使用,语法见 [Android 平台特定动作](./automate-with-scripts-in-yaml#the-android-part)。 - 通用交互方法请查阅 [API 参考(通用)](./api#interaction-methods)。 ::: ### Android 特有方法 #### `agent.launch()` 启动网页或原生 Android activity/package。 ```ts function launch(target: string): Promise; ``` - `target: string` —— 可以是网页 URL,也可以是 `package/.Activity` 形式的字符串,例如 `com.android.settings/.Settings`,也可以是应用包名、URL 或应用名称。若传入应用名称且在 `appNameMapping` 中存在映射,将自动解析为对应包名;若未找到映射,则直接按 `target` 启动。 #### `agent.runAdbShell()` 通过连接的设备运行原始的 `adb shell` 命令。 ```ts function runAdbShell(command: string): Promise; ``` - `command: string` —— 原样传递给 `adb shell` 的命令。 ```ts const result = await agent.runAdbShell('dumpsys battery'); console.log(result); ``` #### 导航辅助 - `agent.back(): Promise` —— 触发 Android 系统的返回操作。 - `agent.home(): Promise` —— 返回桌面。 - `agent.recentApps(): Promise` —— 打开多任务/最近应用界面。 ### 辅助工具 #### `agentFromAdbDevice()` 从任意已连接的 adb 设备创建 `AndroidAgent`。 ```ts function agentFromAdbDevice( deviceId?: string, opts?: PageAgentOpt & AndroidDeviceOpt, ): Promise; ``` - `deviceId?: string` —— 连接特定设备;留空表示使用“第一个可用设备”。 - `opts?: PageAgentOpt & AndroidDeviceOpt` —— 在一个对象中合并 Agent 选项与 [`AndroidDevice`](#androiddevice) 的设置。 #### `getConnectedDevices()` 列举 Midscene 可驱动的 adb 设备。 ```ts function getConnectedDevices(): Promise>; ``` ### 相关阅读 - [Android 快速开始](./android-getting-started) 获取搭建与脚本示例。 --- url: /zh/android-getting-started.md --- import { PackageManagerTabs } from '@theme'; # Android 开始使用 本指南将带你完成使用 Midscene 自动化 Android 设备所需的一切:通过 adb 连接真机、配置模型 API Key、体验零代码 Playground,并运行你的首个 JavaScript 脚本。 :::info 示例项目 使用 JavaScript 控制 Android 设备:[https://github.com/web-infra-dev/midscene-example/blob/main/android/javascript-sdk-demo](https://github.com/web-infra-dev/midscene-example/blob/main/android/javascript-sdk-demo) 集成 Vitest 进行测试:[https://github.com/web-infra-dev/midscene-example/tree/main/android/vitest-demo](https://github.com/web-infra-dev/midscene-example/tree/main/android/vitest-demo) ::: ## 配置 AI 模型服务 将你的模型配置写入环境变量,可参考 [模型策略](../model-strategy) 了解更多细节。 ```bash export MIDSCENE_MODEL_BASE_URL="https://替换为你的模型服务地址/v1" export MIDSCENE_MODEL_API_KEY="替换为你的 API Key" export MIDSCENE_MODEL_NAME="替换为你的模型名称" export MIDSCENE_MODEL_FAMILY="替换为你的模型系列" ``` 更多配置信息请参考 [模型策略](../model-strategy) 和 [模型配置](../model-config)。 ## 准备工作 在编写脚本前,先确认 adb 能够连接设备且设备信任当前电脑。 ### 安装 adb 并设置 `ANDROID_HOME` - 通过 [Android Studio](https://developer.android.com/studio) 或 [命令行工具](https://developer.android.com/studio#command-line-tools-only) 安装 adb - 验证安装是否成功: ```bash adb --version ``` 出现类似输出表示安装成功: ```log Android Debug Bridge version 1.0.41 Version 34.0.4-10411341 Installed as /usr/local/bin//adb Running on Darwin 24.3.0 (arm64) ``` - 按 [Android environment variables](https://developer.android.com/tools/variables) 设置 `ANDROID_HOME`,并验证: ```bash echo $ANDROID_HOME ``` 有输出即代表配置成功: ```log /Users/your_username/Library/Android/sdk ``` ### 启用 USB 调试并验证设备 在系统设置的开发者选项中开启 **USB 调试**(若有 **USB 调试(安全设置)** 也请一并开启),然后用数据线连接手机。

android usb debug

验证连接: ```bash adb devices -l ``` 出现类似输出代表连接成功: ```log List of devices attached s4ey59 device usb:34603008X product:cezanne model:M2006J device:cezan transport_id:3 ``` ## 试用 Playground(零代码) Playground 是验证连接、观察 AI Agent 的最快方式,无需编写代码。它与 `@midscene/android` 共享相同的代码实现,因此在 Playground 上验证通过的流程,用脚本运行时也完全一致。 ![](/android-playground.png) 1. 启动 Playground CLI: ```bash npx --yes @midscene/android-playground ``` 2. 点击 Playground 窗口中的齿轮按钮,粘贴你的 API Key 配置。如果还没有 API Key,请回到 [模型配置](./model-config) 获取。 ![](/android-set-env.png) ### 开始体验 配置完成后,你可以立即开始体验 Midscene。它提供了多个关键操作 Tab: - **Act**: 与网页进行交互,这就是自动规划(Auto Planning),对应于 `aiAct` 方法。比如 ``` 在搜索框中输入 Midscene,执行搜索,跳转到第一条结果 ``` ``` 填写完整的注册表单,注意主要让所有字段通过校验 ``` - **Query**: 从界面中提取 JSON 结构的数据,对应于 `aiQuery` 方法。 类似的方法还有 `aiBoolean()`, `aiNumber()`, `aiString()`,用于直接提取布尔值、数字和字符串。 ``` 提取页面中的用户 ID,返回 { id: string } 结构的 JSON 数据 ``` - **Assert**: 理解页面,进行断言,如果不满足则抛出错误,对应于 `aiAssert` 方法。 ``` 页面上存在一个登录按钮,它的下方有一个用户协议的链接 ``` - **Tap**: 在某个元素上点击,这就是即时操作(Instant Action),对应于 `aiTap` 方法。 ``` 点击登录按钮 ``` > 关于自动规划(Auto Planning)和即时操作(Instant Action)的区别,请参考 [API](../api.mdx) 文档。 ## 集成 Midscene Agent 当 Playground 运行正常后,就可以切换到可复用的 JavaScript 脚本。 ### 第 1 步:安装依赖 ### 第 2 步:编写脚本 下面的示例会在设备上打开浏览器、搜索 eBay,并断言结果列表。 ```typescript title="./demo.ts" import { AndroidAgent, AndroidDevice, getConnectedDevices, } from '@midscene/android'; const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); Promise.resolve( (async () => { const devices = await getConnectedDevices(); const device = new AndroidDevice(devices[0].udid); const agent = new AndroidAgent(device, { aiActionContext: 'If any location, permission, user agreement, etc. popup, click agree. If login page pops up, close it.', }); await device.connect(); await agent.aiAct('open browser and navigate to ebay.com'); await sleep(5000); await agent.aiAct('type "Headphones" in search box, hit Enter'); await agent.aiWaitFor('There is at least one headphone product'); const items = await agent.aiQuery( '{itemTitle: string, price: Number}[], find item in list and corresponding price', ); console.log('headphones in stock', items); await agent.aiAssert('There is a category filter on the left'); })(), ); ``` ### 第 3 步:运行示例 ```bash npx tsx demo.ts ``` ### 第 4 步:查看报告 脚本成功后会输出 `Midscene - report file updated: /path/to/report/some_id.html`。在浏览器中打开该 HTML 文件即可回放每一步交互、查询与断言。 ## 进阶 当你需要自定义设备行为、把 Midscene 接入独立框架,或排查 adb 问题时,可参考本节内容。更多构造函数参数可前往 [API 参考(Android)](./android-api-reference)。 ### 扩展 Android 上的 Midscene 使用 `defineAction()` 定义自定义手势,并通过 `customActions` 传入。Midscene 会把自定义动作追加到规划器中,让 AI 可以调用你领域特定的动作名。 ```typescript import { getMidsceneLocationSchema, z } from '@midscene/core'; import { defineAction } from '@midscene/core/device'; import { AndroidAgent, AndroidDevice, getConnectedDevices } from '@midscene/android'; const ContinuousClick = defineAction({ name: 'continuousClick', description: 'Click the same target repeatedly', paramSchema: z.object({ locate: getMidsceneLocationSchema(), count: z.number().int().positive().describe('How many times to click'), }), async call(param) { const { locate, count } = param; console.log('click target center', locate.center); console.log('click count', count); }, }); const devices = await getConnectedDevices(); const device = new AndroidDevice(devices[0].udid); await device.connect(); const agent = new AndroidAgent(device, { customActions: [ContinuousClick], }); await agent.aiAct('click the red button five times'); ``` 关于自定义动作和动作 Schema 的更多解释,请参阅 [与任意界面集成](./integrate-with-any-interface#define-a-custom-action)。 ## 更多 - 查看所有 Agent 方法:[API 参考(通用)](./api#interaction-methods) - Android 专属参数与接口:[Android Agent API](./android-api-reference) - 示例项目 - Android JavaScript SDK 示例:[https://github.com/web-infra-dev/midscene-example/blob/main/android/javascript-sdk-demo](https://github.com/web-infra-dev/midscene-example/blob/main/android/javascript-sdk-demo) - Android + Vitest 示例:[https://github.com/web-infra-dev/midscene-example/tree/main/android/vitest-demo](https://github.com/web-infra-dev/midscene-example/tree/main/android/vitest-demo) --- url: /zh/android-introduction.md --- # Android 自动化支持 Midscene 可以驱动 adb 工具来实现 Android 自动化。 由于适配了视觉模型方案,整个自动化过程可以适配任意的 App 技术栈,无论是 Native、Flutter 还是 React Native 构建的 App 或小程序都能使用。开发者只需面向最终效果调试 UI 自动化脚本即可。 Android UI 自动化解决方案具备 Midscene 的全部特性: - 支持使用 Playground 进行零代码试用。 - 支持 JavaScript SDK。 - 支持使用 YAML 格式的自动化脚本和命令行工具。 - 支持生成 HTML 报告来回放所有操作路径。 ## 案例展示 **Prompt** : 打开懂车帝,搜索 su7 车型,查看参数配置