Cuttlefish 的默认 WebRTC 浏览器界面包含一个控制台,用于提供更多方式来与虚拟设备交互。
该控制台包含多个默认按钮,以模拟常见的实体设备操作,例如电源按钮、音量按钮、设备旋转。
自定义操作
您可以自定义该控制台,添加更多按钮,以便让您的虚拟设备更好地模拟您的实体设备。这对于测试设备的独特功能(例如硬件按钮,或可触发操作系统中独特操作的特殊手势)非常实用。您还可以使用自定义按钮来支持测试更多侧重于质量检查的功能,例如设备电量不足时操作系统的行为。
默认的 Cuttlefish 控制台支持“插入”自定义操作,而无需修改主 Cuttlefish AOSP 项目。您的虚拟设备只需包含一个很小的配置文件,即可开始使用自定义操作。请参阅此自定义操作配置文件示例。
创建一个定义设备的自定义操作的 JSON 文件。您可以将此文件放入您拥有的任何目录中。对此文件结构的说明请见下文的 ADB shell 和操作服务器部分。
为您的 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", }
在设备的产品 makefile 中设置 Soong 配置 build 变量,从而配置虚拟设备的主机包,使其包含您的自定义操作配置文件。
# 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 命令
- 操作服务器
您的 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
:包含以下子字段的单个按钮对象:command
:此按钮的唯一名称title
:此按钮的替代文本标题icon_name
:来自 https://material.io/resources/icons 的图标的名称
操作服务器
操作服务器可实现对操作行为的更多控制。操作服务器是一个主机二进制文件,其使用套接字对监听来自 WebRTC 的按钮按下事件。WebRTC 会将事件转发到操作服务器,然后操作服务器决定如何实现该操作。
操作服务器可实现更强大的控制,例如维持状态(如维持可切换事件的状态),或者运行“元操作”(例如终止当前设备、启动更多设备或启动用于录制屏幕的浏览器扩展程序)。可能性仅受限于您决定在主机二进制文件中实现什么样的控制机制。
以下 JSON 代码段定义了一个用于监听两个按钮上的事件的操作服务器:
{
"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 配置后,将操作服务器模块的名称附加到 Soong 配置 build 变量 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
每个操作服务器主机二进制文件都应执行以下步骤:
接受一个套接字文件描述符编号作为第一个,也是唯一的一个程序参数。
此套接字由
launch_cvd
使用socketpair
创建,域名为AF_LOCAL
,类型为SOCK_STREAM
,协议为 0。在循环中,尝试从此套接字中读取 128 个字节。这些字节包含 WebRTC 客户端发送的格式为
command:state
的按钮按下事件。command
与在 JSON 配置中提供的相同,state
为按钮按下状态(down
或up
)。根据传入事件执行操作,以模拟自定义操作。