用 Gemini 3.5 Flash 原生 Computer Use 控制 Android 手机:ADB 桥接完整实操指南

溪行者AI 前沿2026-09-18974 阅读💛 284 收藏

Gemini 3.5 Flash 内置了 Computer Use 能力。模型看一张截图,决定下一步做什么,返回一个函数调用如 click(y=300, x=500)。你的代码通过 ADB 在设备上执行该动作,再截一张新截图发回去。循环往复直到任务完成。Philipp Schmid 这篇指南带你用 mobile 环境和 Python SDK 控制一台 Android 模拟器。

演示

配套代码仓库:github.com/google-gemini/gemini-android-computer-use-quickstart

Computer Use 是什么

Computer Use 是 Gemini 3.5 Flash 的原生工具。你给模型一张截图和一个目标(“打开设置并开启深色模式”),模型返回结构化动作:点击、输入文字、滑动、启动应用。你的代码在目标设备上执行这些动作。

它的工作方式类似函数调用:模型提出动作,你执行,把结果发回。模型通过截图持续保持在循环中。

Gemini 支持三种 Computer Use 环境:browser 用于桌面网页自动化,mobile 用于移动设备/模拟器,desktop 用于操作系统级控制。本指南使用 mobile。

环境示意

伪代码级的 Agent 循环是:创建 genai 客户端与 ADB 桥接器,截取初始截图并发送首个请求(输入=文本任务+base64 截图,工具=computer_use 环境 mobile);循环处理 function_calls——用桥接器执行 click、type、open_app 等动作,截图后带 function_results 一起回传,直到模型不再返回函数调用。

环境搭建

不需要 Android Studio 图形界面。在你的 Mac 上运行安装脚本即可从终端装好 Android SDK、模拟器并创建虚拟设备。

第一步运行安装脚本:setup_emulator.sh(仓库内含),先 chmod +x 再执行。第二步安装 Python 依赖:pip install google-genai。Python 脚本会自动定位 SDK 路径并在后台启动模拟器,无需手动导出环境变量。

Agent 循环核心实现

完整脚本 agent.py 自动完成三件事:设置环境变量、后台启动模拟器(若未运行)、等待启动完成后开始 Computer Use 循环。

环境准备函数 setup_android_env 依次检查 ANDROID_HOME 环境变量与两个 Homebrew 默认路径,找到后把 cmdline-tools、emulator、platform-tools 三个子目录注入 PATH。

start_emulator 先用 adb devices 探测已有模拟器;没有则以新会话后台启动 emulator -avd AI_Agent_Phone,循环 60 次每 2 秒检查一次 sys.boot_completed 属性,等于 1 即就绪。

ADBBridge 类是动作执行核心。初始化时用 wm size 读取物理分辨率并默认 1080x1920 兜底。关键在坐标换算:模型在归一化 0-999 网格上输出坐标,_px 方法把它们换算成实际像素——x/1000宽度、y/1000高度。

动作方法覆盖手机全操作:click(y,x) 换算像素后用 input tap 点击;type(text) 用 input text 输入(空格替换为 %s),press_enter 时补 keyevent 66;open_app 用 monkey 命令按包名启动应用,捕获”No activities found”报未安装;scroll(y,x,direction) 按 0-800 归一化幅度换算滑动距离,up/down/left/right 四向;long_press 原地长按 swipe 指定毫秒;drag_and_drop 起终点换算后 swipe 300ms;press_key 映射 home=3、back=4、enter=66、app_switch=187;list_apps 用 pm list packages -3 列第三方应用;screenshot 用 adb exec-out screencap -p 直接拿 PNG 字节流。

系统提示词给模型明确规则:正在操作 Android 手机、用提供的工具完成任务、假设元素缺失前先滚动查看全屏、可按包名从任意位置打开应用、只用 type 工具输入文字而不用虚拟键盘、任务完成直接声明。

run_agent 主循环每轮调用 interactions.create,传入任务文本+最新截图、computer_use 工具与 previous_interaction_id 维持会话。对每个 function_call 步骤:getattr 从桥接器取同名方法执行,结果包成 function_result(状态+可选返回值+新截图)。若参数带 safety_decision,演示模式下自动回 safety_acknowledgement=true。无函数调用时打印 output_text 结束。

运行方式:export GEMINI_API_KEY 后执行 python agent.py "Open Settings and enable dark mode",模拟器未启动会自动拉起。

连接远程设备

也可以把目标换成实体手机或云端模拟器而非本地虚拟机。在目标设备上开启开发者选项并打开 USB 调试或无线调试(官方 ADB over Wi-Fi 文档有详细设置)。然后用 adb connect <设备IP>:5555 连接,并把连接串作为 device_id 参数传给 run_agent,例如 run_agent("Check the weather", device_id="35.200.100.10:5555")

进阶方向与工程要点

支持 iOS/iPhone:Gemini API 的 mobile 环境与平台无关——无论 Android 还是 iOS,模型都在同一归一化 0-999 网格上输出动作。要操作 iPhone 或 iOS 模拟器,只需把 ADBBridge 换成 iOS 兼容工具:模拟器用 Apple 的 simctl CLI,真机可用 Appium 或 go-ios。

生产健壮性:这里的 Python 桥接是同步且为演示优化。生产环境应实现网络中断重试、优雅处理 ADB 断连、异步执行操作。

安全决策处理:真实任务中(尤其涉及修改状态或支付),模型可能给动作步骤标记 safety_decision 请求确认。生产循环必须检查 step.arguments 中的安全标志,先提示用户确认再执行动作,详见 Gemini API Computer Use 安全指南。

原文信息

  • 作者:Philipp Schmid(@_philschmid),Google DeepMind 工程师
  • 原文发布日期:2026-06-25 原文地址:

文章评论(2

吴超5 小时前

内容翔实,正好需要,先收藏再看。

回复
逐光而行5 小时前

作者写得真不错,学到了不少。

回复