Painel de controle do choco

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

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

Ações personalizadas

Você pode personalizar o painel de controle para adicionar mais botões que permitem que seu dispositivo virtual emule mais de perto seu dispositivo físico. Isso é útil para testar recursos exclusivos do seu dispositivo, como um botão de hardware ou um gesto especial que aciona uma ação exclusiva no sistema operacional. Você também pode usar botões personalizados para habilitar o teste de recursos mais focados em controle de qualidade, como o comportamento do seu sistema operacional quando o dispositivo está com pouca bateria.

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

  1. Crie um arquivo JSON que defina as ações personalizadas do seu dispositivo. Você pode colocar este arquivo em qualquer diretório de sua propriedade. A estrutura desse arquivo é descrita nas seções shell do ADB e servidor de ação .

  2. Crie um módulo prebuilt_etc_host para sua configuração JSON. Certifique-se de que o sub_dir seja 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 as variáveis ​​de compilação de configuração Soong no makefile do produto do seu dispositivo para configurar o pacote de host do dispositivo virtual para incluir seu arquivo de configuração de ação 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
    

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

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

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

Comando de shell ADB

Você pode definir um único botão que é implementado executando 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 no adb shell quando o botão é pressionado
  • button : Um único objeto de botão com os seguintes subcampos:

Servidor de ação

Os servidores de ação permitem mais controle sobre o comportamento de suas ações. Um servidor de ação é um binário de host que escuta 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, o servidor de ação decide como implementar a ação.

Os servidores de ação permitem um controle mais poderoso, como manter o estado (como para um evento alternável) ou até mesmo executar "meta-ações", como encerrar o dispositivo atual, iniciar mais dispositivos ou iniciar uma extensão do navegador de gravação de tela. As possibilidades são limitadas apenas pelo que você decidir 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 seu 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ção à variável de compilação da configuração Soong cvd_custom_action_servers . Por 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 do host do servidor de ação deve executar as seguintes etapas:

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

    Este socket é criado por launch_cvd usando socketpair com domínio AF_LOCAL , tipo SOCK_STREAM e 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 . O command é fornecido na configuração JSON e o state é o estado de pressionamento do botão ( down ou para up ).

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