Panel de control de Cuttlefish

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 más de cerca el dispositivo físico. 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.

  1. 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 shell de ADB y Servidor de acción.

  2. Crea un módulo prebuilt_etc_host para tu configuración JSON. Asegúrate de que sub_dir sea igual a 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. 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 a fin de 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 en adb 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 binario de tu 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 acciones debe realizar los siguientes pasos:

  1. Acepta un número de descriptor de archivo de socket como primer y único argumento del programa.

    launch_cvd crea este socket mediante socketpair con el dominio AF_LOCAL, el tipo SOCK_STREAM y el protocolo 0.

  2. 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 y state es el estado de pulsación del botón (down o up).

  3. Actúa según los eventos entrantes para simular la acción personalizada.