本文介绍使用无影 AgentBay SDK 对云手机进行应用管理的功能。包括如何在云环境中启动、监控和控制云手机应用程序。
概述
Mobile Use模块为Android移动设备提供应用程序管理功能,包括:
应用程序发现 - 查询设备上已安装的应用程序。
应用程序生命周期管理 - 使用包名启动和停止移动应用程序。
Activity管理 - 启动特定的Android Activity。
进程监控 - 跟踪正在运行的应用程序及其进程。
创建会话
import os
from agentbay import AgentBay
from agentbay.session_params import CreateSessionParams
api_key = os.getenv("AGENTBAY_API_KEY")
if not api_key:
raise ValueError("AGENTBAY_API_KEY 环境变量是必需的")
agent_bay = AgentBay(api_key=api_key)
params = CreateSessionParams(image_id="mobile_latest")
result = agent_bay.create(params)
if result.success:
session = result.session
print(f"会话已创建: {session.session_id}")
else:
print(f"创建会话失败: {result.error_message}")
exit(1)
# 实际输出:
# 会话已创建: session-04bdw8o39c9uiwet4
获取已安装的应用程序
查询移动设备上已安装的应用程序列表。
result = session.mobile.get_installed_apps(
start_menu=True,
desktop=False,
ignore_system_apps=True
)
if result.success:
apps = result.data
print(f"找到 {len(apps)} 个已安装的应用程序")
for app in apps[:5]:
print(f"名称: {app.name}")
print(f"启动命令: {app.start_cmd}")
print(f"停止命令: {app.stop_cmd if app.stop_cmd else 'N/A'}")
print(f"工作目录: {app.work_directory if app.work_directory else 'N/A'}")
print("---")
else:
print(f"错误:{result.error_message}")
# 实际输出 (使用当前 mobile_latest 镜像):
# 找到 0 个已安装的应用程序
参数:
start_menu(bool): 是否包含开始菜单应用程序。desktop(bool): 是否包含桌面应用程序。ignore_system_apps(bool): 是否过滤系统应用程序。
返回值:
包含
InstalledApp对象列表的InstalledAppListResult。
当前的 mobile_latest 镜像在列表中不包含预装应用程序,因此此方法返回空列表。但仍然可以使用包名启动应用程序。
启动应用程序
使用带有包名的"monkey -p"命令格式启动移动应用程序。
通过包名启动
# 使用 "monkey -p" 格式启动 Android 应用程序
start_cmd = "monkey -p com.android.settings"
result = session.mobile.start_app(start_cmd)
if result.success:
processes = result.data
print(f"应用程序已启动,共 {len(processes)} 个进程")
for process in processes:
print(f"进程: {process.pname} (PID: {process.pid})")
else:
print(f"启动应用程序失败:{result.error_message}")
# 实际输出:
# 应用程序已启动,共 1 个进程
# 进程: com.android.settings (PID: 2805)
始终使用
"monkey -p <package_name>"格式启动应用程序。常见的Android包名:
设置:
com.android.settingsChrome浏览器::
com.android.chrome计算器:
com.android.calculator2联系人:
com.android.contacts
启动指定Activity(Android)
start_cmd = "monkey -p com.android.settings"
activity = ".Settings"
result = session.mobile.start_app(
start_cmd=start_cmd,
activity=activity
)
if result.success:
processes = result.data
print(f"应用程序已启动,Activity为 {activity}")
print(f"找到 {len(processes)} 个进程")
for process in processes:
print(f"进程: {process.pname} (PID: {process.pid})")
else:
print(f"启动应用程序失败: {result.error_message}")
# 实际输出:
# 应用程序已启动,Activity为 .Settings
# 找到 1 个进程
# 进程: com.android.settings (PID: 2921)
activity 参数允许启动应用程序内的特定Activity,包括:
相对名称:
".SettingsActivity"完整名称:
"com.package/.Activity"
常见的Activity示例:
设置:
com.android.settings配合 Activity.Settings。浏览器:
com.android.chrome配合 Activitycom.google.android.apps.chrome.Main。计算器:
com.android.calculator2配合 Activity.Calculator。
停止应用程序
stop_cmd参数需设置为包名 ,例如 "com.android.settings"。
# 启动一个应用程序
start_result = session.mobile.start_app("monkey -p com.android.settings")
if start_result.success:
print("应用程序启动成功")
for process in start_result.data:
print(f" 进程: {process.pname} (PID: {process.pid})")
# 使用包名停止应用程序
result = session.mobile.stop_app_by_cmd("com.android.settings")
if result.success:
print("应用程序已成功停止")
else:
print(f"停止应用程序失败: {result.error_message}")
# 实际输出:
# 应用程序启动成功
# 进程: com.android.settings (PID: 3042)
# 应用程序已成功停止
完整工作流程示例
import os
import time
from agentbay import AgentBay
from agentbay.session_params import CreateSessionParams
api_key = os.getenv("AGENTBAY_API_KEY")
if not api_key:
raise ValueError("AGENTBAY_API_KEY 环境变量是必需的")
agent_bay = AgentBay(api_key=api_key)
# 创建移动会话
params = CreateSessionParams(image_id="mobile_latest")
result = agent_bay.create(params)
if not result.success:
print(f"创建会话失败: {result.error_message}")
exit(1)
session = result.session
print(f"会话已创建: {session.session_id}")
# 步骤 1: 启动应用程序
print("步骤 1: 启动设置应用程序...")
start_result = session.mobile.start_app("monkey -p com.android.settings")
if not start_result.success:
print(f"启动应用程序失败: {start_result.error_message}")
agent_bay.delete(session)
exit(1)
print(f"应用程序已启动,共 {len(start_result.data)} 个进程")
for process in start_result.data:
print(f" - {process.pname} (PID: {process.pid})")
# 步骤 2: 等待应用程序加载
print("步骤 2: 等待应用程序加载...")
time.sleep(3)
# 步骤 3: 停止应用程序
print("步骤 3: 停止应用程序...")
stop_result = session.mobile.stop_app_by_cmd("com.android.settings")
if stop_result.success:
print("应用程序已成功停止")
else:
print(f"停止应用程序失败:{stop_result.error_message}")
# 清理
print("清理会话...")
agent_bay.delete(session)
print("工作流程已完成!")
# 实际输出:
# 会话已创建:session-04bdwfj7tnhfnzibx
# 步骤 1: 启动设置应用程序...
# 应用程序已启动,共 1 个进程
# - com.android.settings (PID: 3268)
# 步骤 2: 等待应用程序加载...
# 步骤 3: 停止应用程序...
# 应用程序已成功停止
# 清理会话...
# 工作流程已完成API参考
方法 | 参数 | 返回值 | 描述 |
|
|
| 获取已安装应用程序列表 |
|
|
| 启动移动应用程序 |
|
|
| 通过包名停止应用程序 |
返回类型
InstalledAppListResult
success(bool): 操作是否成功data(List[InstalledApp]): 已安装应用程序列表error_message(str): 如果操作失败,则返回错误消息request_id(str): 唯一请求标识符
InstalledApp
name(str): 应用程序名称start_cmd(str): 启动应用程序的命令/包名stop_cmd(Optional[str]): 停止应用程序的命令work_directory(Optional[str]): 应用程序的工作目录
ProcessListResult
success(bool): 操作是否成功data(List[Process]): 进程对象列表error_message(str): 如果操作失败,则返回错误消息request_id(str): 唯一请求标识符
Process
pname(str): 进程名称pid(int): 进程IDcmdline(Optional[str]): 完整命令行
AppOperationResult
success(bool): 操作是否成功error_message(str): 如果操作失败,则返回错误消息request_id(str): 唯一请求标识符
云手机特有参数
启动命令格式
start_cmd 参数必须使用"monkey -p"格式。
session.mobile.start_app("monkey -p com.android.settings")停止命令格式
stop_cmd 参数需设置为包名。
session.mobile.stop_app_by_cmd("com.android.settings")Activity参数 (Android)
activity 参数允许启动特定的Activity。
session.mobile.start_app(
start_cmd="monkey -p com.android.settings",
activity=".Settings"
)Activity名称可以指定为:
相对名称:
.SettingsActivity将自动添加包前缀。完整名称:
com.package/.Activity完整的Activity标识符。