La interfaz de navegador WebRTC predeterminada para Cuttlefish incluye un panel de control que ofrece más formas de interactuar con el dispositivo virtual.
El panel de control presenta botones predeterminados para simular acciones comunes de dispositivos físicos, como el botón de encendido o los botones de volumen, así como la rotación del dispositivo.
Acciones personalizadas
Puedes personalizar el panel de control para agregar más botones que permitan que el dispositivo virtual emule el dispositivo físico con mayor precisión. Eso sirve para probar funciones exclusivas de tu dispositivo, como un botón de hardware o un gesto especial que desencadene una acción única en el SO. También puedes usar botones personalizados para permitir que se prueben más funciones centradas en el control de calidad, como el comportamiento del SO cuando el dispositivo tiene poca batería.
El panel de control predeterminado de Cuttlefish incluye asistencia para "conectar" acciones personalizadas sin necesidad de modificar el proyecto principal AOSP de Cuttlefish. El dispositivo virtual debe incluir solo un archivo de configuración mínimo para comenzar a usar acciones personalizadas. Consulta este ejemplo de archivo de configuración de acciones personalizadas.
Crea un archivo JSON que defina las acciones personalizadas de tu dispositivo. Puedes colocar ese archivo en cualquier directorio que tengas. La estructura del archivo se describe en las secciones Comando del shell de ADB y Servidor de acción.
Crea un módulo
prebuilt_etc_host
para tu configuración JSON. Asegúrate de quesub_dir
sea igual acvd_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", }
Establece las variantes de compilación de configuración de Soong en el archivo makefile del producto de tu dispositivo para configurar el paquete de host del dispositivo virtual y así incluir tu archivo de configuración de acción personalizada.
# 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
Hay dos métodos compatibles para implementar una acción personalizada:
- Comando del shell de ADB
- Servidor de acción
El archivo de configuración JSON puede definir varias instancias de cada tipo de implementación.
Comando del shell de ADB
Puedes definir un solo botón que se implemente ejecutando un solo comando adb
shell
. Por ejemplo, el siguiente fragmento de JSON define un solo botón que abre una página web:
{
"shell_command":"am start -a android.intent.action.VIEW -d https://www.android.com/",
"button":{
"command":"web",
"title":"Web Page",
"icon_name":"language"
}
}
Los campos son los siguientes:
shell_command
: Es el comando que se ejecuta enadb shell
cuando se presiona el botón.button
: Es un objeto de un solo botón que tiene los siguientes subcampos:command
: Es un nombre único para este botón.title
: Es un título de texto alternativo para este botón.icon_name
: Es el nombre de un ícono de https://material.io/resources/icons.
Servidor de acción
Los servidores de acciones ofrecen un mayor control respecto del comportamiento de tus acciones. Un servidor de acciones es un objeto binario de host que escucha eventos de pulsación de botones de WebRTC mediante un par de sockets. WebRTC reenvía los eventos al servidor de acción y, luego, el servidor de acciones decide cómo implementar la acción.
Los servidores de acción ofrecen un control más eficaz, como mantener el estado (por ejemplo, para un evento que se puede activar) o incluso ejecutar "metaacciones" (como finalizar el dispositivo actual, lanzar más dispositivos o iniciar una extensión de navegador para grabar la pantalla). Las posibilidades están limitadas solo por lo que decidas implementar dentro del objeto binario del host.
En el siguiente fragmento de JSON, se define un servidor de acciones que escucha eventos en dos botones:
{
"server":"cuttlefish_example_action_server",
"buttons":[
{
"command":"settings",
"title":"Quick Settings",
"icon_name":"settings"
},
{
"command":"alert",
"title":"Do Not Disturb",
"icon_name":"notifications_paused"
}
]
}
Los campos son los siguientes:
server
: Es el nombre del módulo de tu objeto binario de host.buttons
: Es una matriz de botones que tienen los mismos subcampos anteriores.
Después de actualizar la configuración de JSON, agrega el nombre del módulo del servidor de acción a la variante de compilación de la configuración de Soong cvd_custom_action_servers
. Por ejemplo:
# 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
Cada objeto binario del host de un servidor de acción debe realizar los siguientes pasos:
Acepta un número de descriptor de archivo de socket como primer y único argumento del programa.
launch_cvd
crea este socket mediantesocketpair
con el dominioAF_LOCAL
, el tipoSOCK_STREAM
y el protocolo 0.En un bucle, intenta leer 128 bytes del socket. Esos bytes contienen eventos de pulsación de botones que envía el cliente WebRTC en formato
command:state
.command
se proporciona en la configuración de JSON ystate
es el estado de pulsación del botón (down
oup
).Actúa según los eventos entrantes para simular la acción personalizada.