应用管理

本文介绍使用无影 AgentBay SDK 对云手机进行应用管理的功能。包括如何在云环境中启动、监控和控制云手机应用程序。

概述

Mobile Use模块为Android移动设备提供应用程序管理功能,包括:

  1. 应用程序发现 - 查询设备上已安装的应用程序。

  2. 应用程序生命周期管理 - 使用包名启动和停止移动应用程序。

  3. Activity管理 - 启动特定的Android Activity。

  4. 进程监控 - 跟踪正在运行的应用程序及其进程。

创建会话

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.settings

    • Chrome浏览器::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 配合 Activity com.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参考

方法

参数

返回值

描述

get_installed_apps()

start_menu: bool<br/>desktop: bool<br/>ignore_system_apps: bool

InstalledAppListResult

获取已安装应用程序列表

start_app()

start_cmd: str<br/>work_directory: str = ""<br/>activity: str = ""

ProcessListResult

启动移动应用程序

stop_app_by_cmd()

stop_cmd: str

AppOperationResult

通过包名停止应用程序

返回类型

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): 进程ID

  • cmdline (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标识符。