Tintenfisch-Bedienfeld

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

Das Bedienfeld verfügt über Standardtasten zur Simulation gängiger physischer Geräteaktionen wie Ein-/Aus-Taste oder Lautstärketasten sowie die Drehung des Geräts.

Benutzerdefinierte Aktionen

Sie können das Bedienfeld anpassen, um weitere Schaltflächen hinzuzufügen, mit denen Ihr virtuelles Gerät Ihr physisches Gerät besser emulieren kann. Dies ist nützlich, um Funktionen zu testen, die nur für Ihr Gerät gelten, beispielsweise eine Hardwaretaste oder eine spezielle Geste, die eine eindeutige Aktion im Betriebssystem auslöst. Sie können auch benutzerdefinierte Schaltflächen verwenden, um das Testen weiterer auf die Qualitätssicherung ausgerichteter Funktionen zu ermöglichen, z. B. das Verhalten Ihres Betriebssystems, wenn der Akku des Geräts schwach ist.

Das standardmäßige Cuttlefish-Kontrollfeld unterstützt das „Einbinden“ benutzerdefinierter Aktionen , ohne dass das Hauptprojekt von Cuttlefish AOSP geändert werden muss . Ihr virtuelles Gerät muss nur eine minimale Konfigurationsdatei enthalten, um benutzerdefinierte Aktionen verwenden zu können. Sehen Sie sich dieses Beispiel einer benutzerdefinierten Aktionskonfigurationsdatei an.

  1. Erstellen Sie eine JSON-Datei, die die benutzerdefinierten Aktionen Ihres Geräts definiert. 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. Erstellen Sie ein prebuilt_etc_host Modul für Ihre JSON-Konfiguration. Stellen Sie sicher, dass das sub_dir cvd_custom_action_config entspricht.

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

Ihre JSON-Konfigurationsdatei kann mehrere Instanzen jedes Implementierungstyps 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 startet:

{
  "shell_command":"am start -a android.intent.action.VIEW -d https://www.android.com/",
  "button":{
      "command":"web",
      "title":"Web Page",
      "icon_name":"language"
  }
}

Die Felder sind:

  • shell_command : Der Befehl, der in adb shell ausgeführt werden soll, wenn die Taste gedrückt wird
  • button : Ein einzelnes Schaltflächenobjekt mit den folgenden Unterfeldern:
    • command : Ein eindeutiger Name für diese Schaltfläche
    • title : Ein Alternativtexttitel für diese Schaltfläche
    • icon_name : Der Name eines Symbols von https://material.io/resources/icons

Aktionsserver

Aktionsserver ermöglichen eine bessere Kontrolle über das Verhalten Ihrer Aktionen. Ein Aktionsserver ist eine Host-Binärdatei, die über ein Socket-Paar auf Tastendruckereignisse von WebRTC lauscht. WebRTC leitet die Ereignisse an den Aktionsserver weiter, und dann entscheidet der Aktionsserver, wie die Aktion implementiert wird.

Aktionsserver ermöglichen eine leistungsfähigere Steuerung, z. B. das Beibehalten des Status (z. B. für ein umschaltbares Ereignis) oder sogar das Ausführen von „Meta-Aktionen“, 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 werden nur dadurch begrenzt, was Sie in der Host-Binärdatei implementieren möchten.

Das folgende JSON-Snippet definiert einen Aktionsserver, 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"
    }
  ]
}

Die Felder sind:

  • server : Der Name Ihres Host-Binärmoduls
  • buttons : Ein Array von Buttons mit den gleichen Unterfeldern wie oben

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

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

    Dieser Socket wird von launch_cvd mithilfe von socketpair mit der Domäne AF_LOCAL , dem Typ SOCK_STREAM und dem Protokoll 0 erstellt.

  2. Versuchen Sie in einer Schleife, 128 Bytes aus dem Socket zu lesen. Diese Bytes enthalten vom WebRTC-Client gesendete Tastendruckereignisse im Format command:state . command ist wie in der JSON-Konfiguration angegeben und state ist der Status des Tastendrucks ( down oder up ).

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