Steuerfeld für Sepia

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.

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

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

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

  1. Eine Socket-Dateibeschreibungsnummer als erstes und einziges Programmargument akzeptieren.

    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 Bytes enthalten Tastendruckereignisse, die vom WebRTC-Client im Format command:state gesendet werden. 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.