イカのコントロールパネル

CuttlefishのデフォルトのWebRTCブラウザーインターフェイスには、仮想デバイスと対話するためのより多くの方法を可能にするコントロールパネルが含まれています。

コントロールパネルには、電源ボタンや音量ボタンなどの一般的な物理デバイスの動作や、デバイスの回転をシミュレートするためのデフォルトのボタンがあります。

カスタムアクション

コントロールパネルをカスタマイズして、仮想デバイスが物理デバイスをより厳密にエミュレートできるようにするボタンを追加できます。これは、ハードウェアボタンや、OSで固有のアクションをトリガーする特別なジェスチャなど、デバイスに固有の機能をテストする場合に役立ちます。カスタムボタンを使用して、デバイスのバッテリー残量が少ないときのOSの動作など、QAに重点を置いた機能をテストすることもできます。

デフォルトのCuttlefishコントロールパネルには、メインのCuttlefishAOSPプロジェクトを変更せずにカスタムアクションを「プラグイン」するためのサポートが含まれています。カスタムアクションの使用を開始するには、仮想デバイスに最小限の構成ファイルのみを含める必要があります。このカスタムアクション構成ファイルの例を参照してください。

  1. デバイスのカスタムアクションを定義するJSONファイルを作成します。このファイルは、所有している任意のディレクトリに置くことができます。このファイルの構造は、 ADBシェルアクションサーバーのセクションで説明されています。

  2. JSON構成用のprebuilt_etc_hostモジュールを作成します。 cvd_custom_action_configsub_dirと等しいことを確認してください。

    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. デバイスの製品makefileでSoongconfigビルド変数を設定して、カスタムアクション構成ファイルを含めるように仮想デバイスホストパッケージを構成します。

    # 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
    

カスタムアクションを実装するためにサポートされている方法は2つあります。

  • ADBシェルコマンド
  • アクションサーバー

JSON構成ファイルは、各タイプの実装の複数のインスタンスを定義できます。

ADBシェルコマンド

単一のadb shellコマンドを実行することで実装される単一のボタンを定義できます。たとえば、次のJSONスニペットは、Webページを起動する単一のボタンを定義します。

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

フィールドは次のとおりです。

  • shell_command :ボタンが押されたときにadb shellで実行するコマンド
  • button :次のサブフィールドを持つ単一のボタンオブジェクト:
    • command :このボタンの一意の名前
    • title :このボタンの代替テキストタイトル
    • icon_namehttps ://material.io/resources/iconsからのアイコンの名前

アクションサーバー

アクションサーバーを使用すると、アクションの動作をより細かく制御できます。アクションサーバーは、ソケットペアを使用してWebRTCからのボタン押下イベントをリッスンするホストバイナリです。 WebRTCはイベントをアクションサーバーに転送し、アクションサーバーがアクションの実装方法を決定します。

アクションサーバーを使用すると、状態の維持(切り替え可能なイベントなど)や、現在のデバイスの強制終了、デバイスの起動、画面記録ブラウザ拡張機能の開始などの「メタアクション」の実行など、より強力な制御が可能になります。可能性は、ホストバイナリ内に実装することを決定したものによってのみ制限されます。

次のJSONスニペットは、2つのボタンでイベントをリッスンするアクションサーバーを定義します。

{
  "server":"cuttlefish_example_action_server",
  "buttons":[
    {
      "command":"settings",
      "title":"Quick Settings",
      "icon_name":"settings"
    },
    {
      "command":"alert",
      "title":"Do Not Disturb",
      "icon_name":"notifications_paused"
    }
  ]
}

フィールドは次のとおりです。

  • server :ホストバイナリモジュールの名前
  • buttons :上記と同じサブフィールドを持つボタンの配列

JSON構成を更新した後、アクションサーバーモジュールの名前をSoong構成ビルド変数cvd_custom_action_serversに追加します。例えば:

# 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

各アクションサーバーホストバイナリは、次の手順を実行する必要があります。

  1. 最初で唯一のプログラム引数としてソケットファイル記述子番号を受け入れます。

    このソケットは、ドメインAF_LOCAL 、タイプSOCK_STREAM 、およびプロトコル0のsocketpairを使用してlaunch_cvdによって作成されます。

  2. ループで、ソケットから128バイトを読み取ろうとします。これらのバイトには、WebRTCクライアントによってcommand:stateの形式で送信されたボタン押下イベントが含まれています。 commandはJSON構成で提供されているとおりであり、 stateはボタンを押した状態( downまたはup )です。

  3. 着信イベントに基づいて動作し、カスタムアクションをシミュレートします。