Panneau de commande de Cuttlefish

L'interface de navigateur WebRTC par défaut pour Cuttlefish inclut un panneau de configuration qui permet d'interagir avec l'appareil virtuel de plusieurs façons.

Le panneau de configuration comporte des boutons par défaut pour simuler des actions courantes sur un appareil physique, telles que les boutons Marche/Arrêt ou de volume, ainsi que la rotation de l'appareil.

Actions personnalisées

Vous pouvez personnaliser le panneau de configuration pour ajouter des boutons qui permettent à votre appareil virtuel d'émuler plus précisément votre appareil physique. Cela est utile pour tester les fonctionnalités propres à votre appareil, comme un bouton matériel ou un geste spécial qui déclenche une action unique dans l'OS. Vous pouvez également utiliser des boutons personnalisés pour tester des fonctionnalités plus axées sur l'assurance qualité, comme le comportement de votre OS lorsque la batterie de l'appareil est faible.

Le panneau de configuration Cuttlefish par défaut permet d'intégrer des actions personnalisées sans avoir à modifier le projet AOSP Cuttlefish principal. Votre appareil virtuel n'a besoin que d'un fichier de configuration minimal pour commencer à utiliser des actions personnalisées. Consultez cet exemple de fichier de configuration d'action personnalisée.

  1. Créez un fichier JSON qui définit les actions personnalisées de votre appareil. Vous pouvez placer ce fichier dans n'importe quel répertoire qui vous appartient. La structure de ce fichier est décrite dans les sections Shell ADB et Serveur d'actions.

  2. Créez un module prebuilt_etc_host pour votre configuration JSON. Assurez-vous que sub_dir est égal à 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. Définissez les variables de compilation de configuration Soong dans le fichier make du produit de votre appareil pour configurer le package hôte de l'appareil virtuel afin d'inclure votre fichier de configuration d'action personnalisée.

    # 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
    

Il existe deux méthodes compatibles pour implémenter une action personnalisée :

  • Commande shell ADB
  • Serveur d'actions

Votre fichier de configuration JSON peut définir plusieurs instances de chaque type d'implémentation.

Commande shell ADB

Vous pouvez définir un seul bouton implémenté en exécutant une seule commande adb shell. Par exemple, l'extrait de code JSON suivant définit un bouton unique qui lance une page Web :

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

Les champs sont les suivants :

  • shell_command : commande à exécuter dans adb shell lorsque l'utilisateur appuie sur le bouton
  • button : objet bouton unique avec les sous-champs suivants :

Serveur d'actions

Les serveurs d'actions vous permettent de mieux contrôler le comportement de vos actions. Un serveur d'action est un binaire hôte qui écoute les événements de pression sur un bouton depuis WebRTC à l'aide d'une paire de sockets. WebRTC transmet les événements au serveur d'action, qui décide ensuite comment implémenter l'action.

Les serveurs d'actions permettent un contrôle plus puissant, par exemple en conservant l'état (comme pour un événement activable/désactivable) ou même en exécutant des "méta-actions" telles que l'arrêt de l'appareil actuel, le lancement d'autres appareils ou le démarrage d'une extension de navigateur d'enregistrement d'écran. Les possibilités ne sont limitées que par ce que vous décidez d'implémenter dans le binaire hôte.

L'extrait de code JSON suivant définit un serveur d'actions qui écoute les événements sur deux boutons :

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

Les champs sont les suivants :

  • server : nom de votre module binaire hôte
  • buttons : tableau de boutons, avec les mêmes sous-champs que ci-dessus.

Après avoir mis à jour la configuration JSON, ajoutez le nom du module du serveur d'actions à la variable de compilation de la configuration Soong cvd_custom_action_servers. Exemple :

# 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

Chaque binaire d'hôte de serveur d'actions doit effectuer les étapes suivantes :

  1. Acceptez un numéro de descripteur de fichier de socket comme premier et seul argument du programme.

    Ce socket est créé par launch_cvd à l'aide de socketpair avec le domaine AF_LOCAL, le type SOCK_STREAM et le protocole 0.

  2. Dans une boucle, tentez de lire 128 octets à partir du socket. Ces octets contiennent les événements d'appui sur les boutons envoyés par le client WebRTC au format command:state. command est fourni dans la configuration JSON, et state correspond à l'état de pression du bouton (down ou up).

  3. Réagissez aux événements entrants pour simuler l'action personnalisée.