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. Beispiel für eine Konfigurationsdatei für benutzerdefinierte Aktionen
Erstellen Sie eine JSON-Datei, in der die benutzerdefinierten Aktionen Ihres Geräts definiert sind. Sie können diese Datei in einem beliebigen Verzeichnis ablegen, das Ihnen gehört. 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 Build-Variablen für die Soong-Konfiguration im Produkt-Makefile Ihres Geräts fest, um das Hostpaket für virtuelle Geräte so zu konfigurieren, dass Ihre Konfigurationsdatei für benutzerdefinierte Aktionen enthalten ist.
# 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 werden zwei Methoden zum Implementieren einer benutzerdefinierten Aktion unterstützt:
- 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. Das folgende JSON-Snippet definiert beispielsweise eine einzelne Schaltfläche, die eine Webseite aufruft:
{
"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 wird.button
: Ein einzelnes Schaltflächenobjekt mit den folgenden Unterfeldern:command
: Ein eindeutiger Name für diese Schaltfläche.title
: Ein Alt-Text-Titel für diese Schaltflächeicon_name
: Der Name eines Symbols von https://material.io/resources/icons
Aktionsserver
Aktionsserver bieten mehr Kontrolle über das Verhalten deiner 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 bieten eine leistungsfähigere Kontrolle, z. B. die Beibehaltung des Status (z. B. für ein ein-/ausschaltbares Ereignis) oder sogar das Ausführen von Meta-Aktionen wie dem Beenden eines aktuellen Geräts, dem Starten weiterer Geräte oder dem Starten einer Browsererweiterung zur 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
Hängen Sie nach dem Aktualisieren der JSON-Konfiguration den Namen des Action Server-Moduls an die Build-Variable cvd_custom_action_servers
der Soong-Konfiguration 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:
Akzeptieren Sie eine Socket-Datei-Deskriptornummer als erstes und einziges Programmargument.
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 Byte enthalten Schaltflächenereignisse, die vom WebRTC-Client im Format
command:state
gesendet wurden.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.