Cuttlefish 控制面板

Cuttlefish 的默认 WebRTC 浏览器界面包含一个控制面板,可以使用更多方式与虚拟设备进行交互。

控制面板具有默认按钮,用于模拟常见的物理设备操作,例如电源按钮或音量按钮以及设备旋转。

自定义操作

您可以自定义控制面板以添加更多按钮,使您的虚拟设备更接近模拟您的物理设备。这对于测试设备独有的功能非常有用,例如硬件按钮或触发操作系统中独特操作的特殊手势。您还可以使用自定义按钮来启用更多以质量保证为中心的功能测试,例如设备电池电量低时操作系统的行为。

默认的 Cuttlefish 控制面板包括对“插入”自定义操作的支持,而无需修改主要的 Cuttlefish AOSP 项目。您的虚拟设备只需要包含一个最小的配置文件即可开始使用自定义操作。请参阅此示例自定义操作配置文件

  1. 创建一个 JSON 文件,用于定义设备的自定义操作。您可以将此文件放在您拥有的任何目录中。此文件的结构在 ADB shellAction server 部分中进行了描述。

  2. 为您的 JSON 配置文件创建一个 prebuilt_etc_host 模块。确保 sub_dir 等于 cvd_custom_action_config

    prebuilt_etc_host {
        // Use any name you choose.
        name: "my_custom_action_config.json",
        src: "my_custom_action_config.json",
        // Always use this sub_dir.
        sub_dir: "cvd_custom_action_config",
    }
    
  3. 在您设备的产品 makefile 中设置 Soong 配置构建变量,以配置虚拟设备主机软件包以包含您的自定义操作配置文件。

    # Set these variables exactly as shown here to enable the host package to see
    # your custom config module name.
    SOONG_CONFIG_NAMESPACES += cvd
    SOONG_CONFIG_cvd += custom_action_config
    
    # Set this value to the name of your JSON module.
    SOONG_CONFIG_cvd_custom_action_config := my_custom_action_config.json
    

有两种支持的方法来实现自定义操作

  • ADB shell 命令
  • Action server

您的 JSON 配置文件可以定义每种实现类型的多个实例。

ADB shell 命令

您可以定义一个按钮,该按钮通过执行单个 adb shell 命令来实现。例如,以下 JSON 代码段定义了一个启动网页的按钮

{
  "shell_command":"am start -a android.intent.action.VIEW -d https://www.android.com/",
  "button":{
      "command":"web",
      "title":"Web Page",
      "icon_name":"language"
  }
}

字段如下

  • shell_command:按下按钮时在 adb shell 中执行的命令
  • button:具有以下子字段的单个按钮对象

Action server

Action server 允许更好地控制操作的行为。Action server 是一个主机二进制文件,它使用套接字对侦听来自 WebRTC 的按钮按下事件。WebRTC 将事件转发到 Action server,然后 Action server 决定如何实现操作。

Action server 允许更强大的控制,例如维护状态(例如对于可切换事件),甚至运行“元操作”,例如终止当前设备、启动更多设备或启动屏幕录制浏览器扩展程序。可能性仅受您决定在主机二进制文件中实现的内容的限制。

以下 JSON 代码段定义了一个 Action server,它侦听两个按钮上的事件

{
  "server":"cuttlefish_example_action_server",
  "buttons":[
    {
      "command":"settings",
      "title":"Quick Settings",
      "icon_name":"settings"
    },
    {
      "command":"alert",
      "title":"Do Not Disturb",
      "icon_name":"notifications_paused"
    }
  ]
}

字段如下

  • server:您的主机二进制模块的名称
  • buttons:按钮数组,具有与上述相同的子字段

更新 JSON 配置后,将 Action server 模块的名称附加到 Soong 配置构建变量 cvd_custom_action_servers。例如

# Append to this variable exactly as shown here.
SOONG_CONFIG_cvd += custom_action_servers

# Append the name of your action server(s) to this variable.
SOONG_CONFIG_cvd_custom_action_servers += cuttlefish_example_action_server

每个 Action server 主机二进制文件应执行以下步骤

  1. 接受套接字文件描述符编号作为第一个也是唯一的程序参数。

    此套接字由 launch_cvd 使用 socketpair 创建,域为 AF_LOCAL,类型为 SOCK_STREAM,协议为 0。

  2. 在一个循环中,尝试从套接字读取 128 个字节。这些字节包含 WebRTC 客户端以 command:state 格式发送的按钮按下事件。command 是 JSON 配置中提供的命令,state 是按钮按下状态(downup)。

  3. 根据传入的事件采取行动以模拟自定义操作。