Die standardmäßige WebRTC-Browseroberfläche für Cuttlefish enthält ein Steuerfeld, mit dem Sie mehr Möglichkeiten haben, mit dem virtuellen Gerät zu interagieren.
Das Steuerfeld enthält Standardschaltflächen, mit denen häufige physische Geräteaktionen wie die Ein-/Aus-Taste oder die Lautstärketasten sowie die Gerätedrehung simuliert werden können.
Benutzerdefinierte Aktionen
Sie können das Steuerfeld anpassen, um weitere Schaltflächen hinzuzufügen, mit denen Ihr virtuelles Gerät Ihr physisches Gerät besser emulieren kann. Das ist nützlich, um Funktionen zu testen, die nur auf Ihrem Gerät verfügbar sind, z. B. eine Hardwaretaste oder eine spezielle Geste, die eine bestimmte Aktion im Betriebssystem auslöst. Mit benutzerdefinierten Schaltflächen können Sie auch Tests für QA-orientierte Funktionen aktivieren, z. B. das Verhalten des Betriebssystems bei niedrigem Akkustand.
Das standardmäßige Cuttlefish-Steuerfeld unterstützt das Einbinden benutzerdefinierter Aktionen, ohne dass das Haupt-AOSP-Projekt von Cuttlefish geändert werden muss. Ihr virtuelles Gerät muss nur eine minimale Konfigurationsdatei enthalten, um benutzerdefinierte Aktionen verwenden zu können. Hier finden Sie ein Beispiel für eine Konfigurationsdatei für benutzerdefinierte Aktionen.
Erstellen Sie eine JSON-Datei, die die benutzerdefinierten Aktionen Ihres Geräts definiert. Sie können diese Datei in ein beliebiges Verzeichnis legen, dessen Eigentümer Sie sind. Die Struktur dieser Datei wird in den Abschnitten ADB-Shell und Action-Server beschrieben.
Erstelle ein
prebuilt_etc_host
-Modul für deine JSON-Konfiguration. Achten Sie darauf, dasssub_dir
mitcvd_custom_action_config
identisch ist.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", }
Legen Sie Soong-Konfigurations-Build-Variablen im Produkt-Makefile Ihres Geräts fest, um das Hostpaket des virtuellen Geräts so zu konfigurieren, dass es Ihre benutzerdefinierte Konfigurationsdatei für Aktionen enthält.
# 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
Es gibt zwei unterstützte Methoden zum Implementieren einer benutzerdefinierten Aktion:
- ADB-Shell-Befehl
- Aktionsserver
In Ihrer JSON-Konfigurationsdatei können Sie mehrere Instanzen jeder Implementierungsart definieren.
ADB-Shell-Befehl
Sie können eine einzelne Schaltfläche definieren, die durch Ausführen eines einzelnen adb
shell
-Befehls implementiert wird. Im folgenden JSON-Snippet wird beispielsweise eine einzelne Schaltfläche definiert, über die eine Webseite geöffnet wird:
{
"shell_command":"am start -a android.intent.action.VIEW -d https://www.android.com/",
"button":{
"command":"web",
"title":"Web Page",
"icon_name":"language"
}
}
Es gibt folgende Felder:
shell_command
: Der Befehl, der inadb shell
ausgeführt werden soll, wenn die Schaltfläche gedrückt wirdbutton
: Ein einzelnes Schaltflächenobjekt mit den folgenden Unterfeldern:command
: Ein eindeutiger Name für diese Schaltflächetitle
: Ein Alt-Text-Titel für diese Schaltflächeicon_name
: Der Name eines Symbols von https://material.io/resources/icons
Aktionsserver
Mit Action-Servern haben Sie mehr Kontrolle über das Verhalten Ihrer Aktionen. Ein Aktionsserver ist ein Host-Binärprogramm, das mithilfe eines Socket-Paares auf Tastendruckereignisse von WebRTC wartet. WebRTC leitet die Ereignisse an den Action-Server weiter, der dann entscheidet, wie die Aktion implementiert werden soll.
Aktionsserver ermöglichen eine umfassendere Steuerung, z. B. das Beibehalten des Status (z. B. für ein umschaltbares Ereignis) oder sogar das Ausführen von „Metaaktionen“, z. B. das Beenden des aktuellen Geräts, das Starten weiterer Geräte oder das Starten einer Browsererweiterung für die Bildschirmaufzeichnung. Die Möglichkeiten sind nur durch das begrenzt, was Sie im Host-Binärcode implementieren.
Im folgenden JSON-Snippet wird ein Aktionsserver definiert, der auf Ereignisse an zwei Schaltflächen wartet:
{
"server":"cuttlefish_example_action_server",
"buttons":[
{
"command":"settings",
"title":"Quick Settings",
"icon_name":"settings"
},
{
"command":"alert",
"title":"Do Not Disturb",
"icon_name":"notifications_paused"
}
]
}
Es gibt folgende Felder:
server
: Der Name des Binärmoduls des Hostsbuttons
: Ein Array von Schaltflächen mit denselben Unterfeldern wie oben
Fügen Sie nach dem Aktualisieren der JSON-Konfiguration den Namen des Aktionsserver-Moduls an die Soong-Konfigurations-Buildvariable cvd_custom_action_servers
an. Beispiel:
# 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
Jede Host-Binärdatei des Aktionsservers sollte die folgenden Schritte ausführen:
Eine Socket-Dateibeschreibungsnummer als erstes und einziges Programmargument akzeptieren.
Dieser Socket wird von
launch_cvd
mitsocketpair
mit der DomainAF_LOCAL
, dem TypSOCK_STREAM
und dem Protokoll 0 erstellt.Versuchen Sie in einer Schleife, 128 Byte aus dem Socket zu lesen. Diese Bytes enthalten Tastendruckereignisse, die vom WebRTC-Client im Format
command:state
gesendet werden.command
entspricht dem in der JSON-Konfiguration angegebenen Wert undstate
ist der Status der Tastenbetätigung (down
oderup
).Ergreifen Sie Maßnahmen bei den eingehenden Ereignissen, um die benutzerdefinierte Aktion zu simulieren.