Panneau de commande de Cuttlefish

L'interface WebRTC par défaut du navigateur pour Cuttlefish inclut un panneau de contrôle qui offre plus de moyens d'interagir avec l'appareil virtuel.

Le panneau de contrôle comporte des boutons par défaut pour simuler des actions physiques courantes sur l'appareil, comme le bouton Marche/Arrêt ou les boutons de volume, ainsi que la rotation de l'appareil.

Actions personnalisées

Vous pouvez personnaliser le panneau de commande pour ajouter des boutons permettant à 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 le contrôle qualité, comme le comportement de votre OS lorsque la batterie de l'appareil est faible.

Le panneau de contrôle Cuttlefish par défaut permet d'intégrer des actions personnalisées sans avoir à modifier le projet AOSP principal de Cuttlefish. Votre appareil virtuel ne doit inclure qu'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 des variables de compilation de configuration Soong dans le fichier makefile du produit de votre appareil pour configurer le package hôte de l'appareil virtuel afin qu'il inclue 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'action

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 JSON suivant définit un seul bouton 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 le bouton est enfoncé
  • button: objet de bouton unique avec les sous-champs suivants :

Serveur d'action

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 les boutons de WebRTC à l'aide d'une paire de sockets. WebRTC transfère les événements au serveur d'action, puis le serveur d'action décide de la manière dont l'action doit être implémentée.

Les serveurs d'actions permettent un contrôle plus puissant, comme la conservation de l'état (par exemple, pour un événement activable/désactivable) ou même l'exécution de "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'action 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 hôte du serveur d'actions doit effectuer les étapes suivantes:

  1. Accepte un numéro de descripteur de fichier de socket comme premier et seul argument de 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, essayez de lire 128 octets à partir du socket. Ces octets contiennent des événements de pression sur un bouton envoyés par le client WebRTC au format command:state. command est tel que fourni dans la configuration JSON, et state est l'état de pression du bouton (down ou up).

  3. Agir sur les événements entrants pour simuler l'action personnalisée