Steuerfeld für Sepia

Die standardmäßige WebRTC-Browserschnittstelle für Cuttlefish enthält ein Steuerfeld, das mehr Möglichkeiten zur Interaktion mit dem virtuellen Gerät bietet.

Das Steuerfeld enthält Standardschaltflächen, mit denen sich häufige physische Geräteaktionen wie die Ein/Aus-Taste oder die Lautstärketasten sowie die Gerätedrehung simulieren lassen.

Benutzerdefinierte Aktionen

Sie können das Steuerfeld anpassen, um weitere Schaltflächen hinzuzufügen, damit Ihr virtuelles Gerät Ihr physisches Gerät besser emulieren kann. Das ist nützlich, um gerätespezifische Funktionen zu testen, z. B. eine Hardwaretaste oder eine spezielle Geste, die eine bestimmte Aktion im Betriebssystem auslöst. Sie können auch benutzerdefinierte Schaltflächen verwenden, um QA-orientierte Funktionen wie das Verhalten Ihres Betriebssystems bei niedrigem Akkustand des Geräts zu testen.

Die Standard-Systemsteuerung von Cuttlefish bietet Unterstützung für das „Einbinden“ benutzerdefinierter Aktionen, ohne dass das Haupt-AOSP-Projekt von Cuttlefish geändert werden muss. Ihr virtuelles Gerät benötigt nur eine minimale Konfigurationsdatei, um benutzerdefinierte Aktionen zu verwenden. Beispiel für eine Konfigurationsdatei für benutzerdefinierte Aktionen

  1. Erstellen Sie eine JSON-Datei, die die benutzerdefinierten Aktionen Ihres Geräts definiert. Sie können diese Datei in einem beliebigen Verzeichnis speichern, das Ihnen gehört. Die Struktur dieser Datei wird in den Abschnitten ADB-Shell und Aktionsserver beschrieben.

  2. Erstellen Sie ein prebuilt_etc_host-Modul für Ihre JSON-Konfiguration. Achten Sie darauf, dass sub_dir gleich cvd_custom_action_config 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",
    }
    
  3. Legen Sie in der Produkt-Makefile Ihres Geräts Soong-Konfigurationsvariablen fest, um das virtuelle Geräte-Hostpaket so zu konfigurieren, dass es Ihre benutzerdefinierte Aktionskonfigurationsdatei 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
  • Action-Server

In Ihrer JSON-Konfigurationsdatei können mehrere Instanzen jedes Implementierungstyps definiert werden.

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, mit der eine Webseite aufgerufen 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 in adb 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äche
    • icon_name: Der Name eines Symbols von https://material.io/resources/icons

Action-Server

Aktionsserver ermöglichen mehr Kontrolle über das Verhalten Ihrer Aktionen. Ein Action-Server ist eine Host-Binärdatei, die über ein Socket-Paar auf Tastendruckereignisse von WebRTC wartet. WebRTC leitet die Ereignisse an den Aktionsserver weiter. Dieser entscheidet dann, wie die Aktion ausgeführt werden soll.

Aktionsserver ermöglichen eine leistungsstärkere Steuerung, z. B. das Beibehalten des Status (z. B. für ein umschaltbares Ereignis) oder sogar das Ausführen von „Meta-Aktionen“ wie 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ärprogramm implementieren.

Im folgenden JSON-Snippet wird ein Aktionsserver definiert, der auf Ereignisse auf 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 Ihres Host-Binärmoduls
  • buttons: Ein Array von Schaltflächen mit denselben Unterfeldern wie oben.

Hängen Sie nach dem Aktualisieren der JSON-Konfiguration den Namen des Aktionsservermoduls an die Soong-Konfigurations-Build-Variable 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 Binärdatei des Aktionsserverhosts sollte die folgenden Schritte ausführen:

  1. Akzeptieren Sie eine Socket-Dateideskriptornummer als erstes und einziges Programmargument.

    Dieser Socket wird von launch_cvd mit socketpair mit der Domain AF_LOCAL, dem Typ SOCK_STREAM und dem Protokoll 0 erstellt.

  2. Versuchen Sie, in einer Schleife 128 Byte aus dem Socket zu lesen. Diese Byte enthalten Schaltflächen-Ereignisse, die vom WebRTC-Client im Format command:state gesendet werden. command wird in der JSON-Konfiguration angegeben und state ist der Zustand des Tastendrucks (down oder up).

  3. Reagieren Sie auf die eingehenden Ereignisse, um die benutzerdefinierte Aktion zu simulieren.