Steuerfeld für Sepia-Tintenfische

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

  1. 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.

  2. Erstelle ein prebuilt_etc_host-Modul für deine JSON-Konfiguration. Achten Sie darauf, dass sub_dir mit cvd_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",
    }
    
  3. 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 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

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 Hosts
  • buttons: 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:

  1. Akzeptieren Sie eine Socket-Datei-Deskriptornummer 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ächenereignisse, die vom WebRTC-Client im Format command:state gesendet wurden. command entspricht dem in der JSON-Konfiguration angegebenen Wert und state ist der Status der Tastenbetätigung (down oder up).

  3. Ergreifen Sie Maßnahmen bei den eingehenden Ereignissen, um die benutzerdefinierte Aktion zu simulieren.