L'interface du navigateur WebRTC par défaut pour Cuttlefish comprend un panneau de configuration qui permet davantage de façons d'interagir avec le périphérique virtuel.
Le panneau de commande comporte des boutons par défaut pour simuler les actions physiques courantes de l'appareil, telles que le bouton d'alimentation ou les boutons de volume, ainsi que la rotation de l'appareil.
Actions personnalisées
Vous pouvez personnaliser le panneau de configuration pour ajouter plus de boutons permettant à votre appareil virtuel d'émuler plus étroitement votre appareil physique. Ceci est utile pour tester des fonctionnalités uniques à votre appareil, telles qu'un bouton matériel ou un geste spécial qui déclenche une action unique dans le système d'exploitation. Vous pouvez également utiliser des boutons personnalisés pour permettre de tester des fonctionnalités davantage axées sur l'assurance qualité, telles que le comportement de votre système d'exploitation lorsque la batterie de l'appareil est faible.
Le panneau de configuration par défaut de Cuttlefish inclut la prise en charge des actions personnalisées « plug-in » sans avoir besoin de modifier le projet principal Cuttlefish AOSP . Votre appareil virtuel doit inclure uniquement un fichier de configuration minimal pour commencer à utiliser des actions personnalisées. Voir cet exemple de fichier de configuration d'action personnalisée .
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 que vous possédez. La structure de ce fichier est décrite dans les sections Shell ADB et Serveur d'action .
Créez un module
prebuilt_etc_host
pour votre configuration JSON. Assurez-vous que lesub_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", }
Définissez les variables de construction de configuration Soong dans le makefile 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 prises en charge 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 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 :
-
shell_command
: La commande à exécuter dansadb shell
lorsque le bouton est enfoncé -
button
: un objet bouton unique avec les sous-champs suivants :-
command
: Un nom unique pour ce bouton -
title
: Un titre en texte alternatif pour ce bouton -
icon_name
: Le nom d'une icône de https://material.io/resources/icons
-
Serveur d'actions
Les serveurs d'actions permettent plus de contrôle sur 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 transmet les événements au serveur d'actions, puis celui-ci décide comment implémenter l'action.
Les serveurs d'action permettent un contrôle plus puissant, comme le maintien de l'état (comme pour un événement basculable) ou même l'exécution de « méta-actions » telles que la suppression de l'appareil actuel, le lancement de plus d'appareils ou le démarrage d'une extension de navigateur avec 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 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 :
-
server
: Le nom de votre module binaire hôte -
buttons
: Un 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 de serveur d'action à la variable de construction de configuration Soong cvd_custom_action_servers
. Par 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'action doit effectuer les étapes suivantes :
Acceptez un numéro de descripteur de fichier socket comme premier et unique argument du programme.
Ce socket est créé par
launch_cvd
en utilisantsocketpair
avec le domaineAF_LOCAL
, tapezSOCK_STREAM
et le protocole 0.Dans une boucle, essayez de lire 128 octets du socket. Ces octets contiennent des événements de pression de bouton envoyés par le client WebRTC au format
command:state
.command
est telle que fournie dans la configuration JSON, etstate
est l'état de la pression sur le bouton (down
ouup
).Agissez sur les événements entrants pour simuler l’action personnalisée.