Painel de controle do Cuttlefish

A interface padrão do navegador WebRTC para o Cuttlefish inclui um painel de controle que permite mais formas de interagir com o dispositivo virtual.

O painel de controle apresenta botões padrão para simular ações comuns de dispositivos físicos, como botões de liga/desliga ou de volume, bem como a rotação de dispositivos.

Ações personalizadas

É possível personalizar o painel de controle para adicionar mais botões que permitam ao dispositivo virtual emular de forma mais aproximada o dispositivo físico. Isso é útil para testar recursos exclusivos do seu dispositivo, por exemplo, um botão físico ou um gesto especial que aciona uma ação única no SO. Também é possível usar botões personalizados que permitam testar mais recursos focados no controle de qualidade, por exemplo, o comportamento do SO quando o dispositivo está com pouca bateria.

O painel de controle padrão do Cuttlefish inclui compatibilidade com ações personalizadas de "plug-in" sem a necessidade de modificar o projeto AOSP principal do Cuttlefish. Seu dispositivo virtual precisa incluir apenas um arquivo de configuração mínima para começar a usar ações personalizadas. Veja este exemplo de arquivo de configuração de ações personalizadas.

  1. Crie um arquivo JSON que defina as ações personalizadas do dispositivo. Esse arquivo pode ser colocado em qualquer um dos seus diretórios. A estrutura desse arquivo é descrita nas seções Shell do ADB e Servidor de ações.

  2. Crie um módulo prebuilt_etc_host para a configuração JSON. Verifique se sub_dir é 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. Defina variantes de build de configuração Soong no makefile do produto do seu dispositivo para configurar o pacote host de dispositivo virtual e incluir seu arquivo de configuração de ações personalizadas.

    # 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
    

Há dois métodos disponíveis para implementar uma ação personalizada:

  • Comando do shell do ADB
  • Servidor de ação

O arquivo de configuração JSON pode definir várias instâncias de cada tipo de implementação.

Comando do shell do ADB

É possível definir um único botão que é implementado com um único comando adb shell. Por exemplo, o snippet JSON a seguir define um único botão que inicia uma página da Web.

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

Os campos são:

  • shell_command: o comando a ser executado em adb shell quando o botão é pressionado.
  • button: um único objeto de botão com os seguintes subcampos:
    • command: um nome exclusivo para esse botão
    • title: um título de texto alternativo para esse botão
    • icon_name: o nome de um ícone de https://material.io/resources/icons (link em inglês)

Servidor de ação

Os servidores de ação permitem maior controle sobre o comportamento das suas ações. Um servidor de ação é um binário de host que detecta eventos de pressionamento de botão do WebRTC usando um par de soquetes. O WebRTC encaminha os eventos para o servidor de ação e, em seguida, decide como implementar a ação.

Os servidores de ação permitem um controle mais eficiente, como manter o estado (por exemplo, em um evento de alternância), ou até executar "ações meta", como eliminar o dispositivo atual, iniciar mais dispositivos ou iniciar uma extensão de navegador para gravação de tela. As possibilidades são limitadas apenas pelo que você decide implementar dentro do binário do host.

O snippet JSON a seguir define um servidor de ação que detecta eventos em dois botões.

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

Os campos são:

  • server: o nome do módulo binário do host
  • buttons: uma matriz de botões, com os mesmos subcampos acima.

Depois de atualizar a configuração JSON, anexe o nome do módulo do servidor de ações à variante de build cvd_custom_action_servers de configuração Soong. Exemplo:

# 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 binário de host do servidor de ação precisa realizar as seguintes etapas:

  1. Aceita um número de descritor do arquivo de soquete como o primeiro e único argumento do programa.

    Esse soquete é criado por launch_cvd usando socketpair com o domínio AF_LOCAL, o tipo SOCK_STREAM e o protocolo 0.

  2. Em um loop, tente ler 128 bytes do soquete. Esses bytes contêm eventos de pressionamento de botão enviados pelo cliente WebRTC no formato command:state. command é fornecido na configuração JSON, e state é o estado de pressionamento do botão, down ou up.

  3. Atue nos eventos de entrada para simular a ação personalizada.