Cuttlefish 控制台

Cuttlefish 的預設 WebRTC 瀏覽器介面包含控制面板,可透過更多方式與虛擬裝置互動。

控制面板提供預設按鈕,可模擬常見的實體裝置動作,例如電源按鈕或音量按鈕,以及裝置旋轉。

自訂操作

你可以自訂控制面板,新增更多按鈕,讓虛擬裝置更貼近實體裝置。這項功能有助於測試裝置專屬功能,例如硬體按鈕或特殊手勢,這些功能會在 OS 中觸發特殊動作。您也可以使用自訂按鈕,啟用以品質保證為主的測試功能,例如裝置電量不足時的 OS 行為。

預設的 Cuttlefish 控制面板支援「插入」自訂動作,不必修改主要的 Cuttlefish AOSP 專案。虛擬裝置只需要包含最少的設定檔,即可開始使用自訂動作。請參閱這個自訂動作設定檔範例

  1. 建立 JSON 檔案,定義裝置的自訂動作。您可以將這個檔案放在任何自有目錄中。如要瞭解這個檔案的結構,請參閱「ADB 殼層」和「動作伺服器」一節。

  2. 為 JSON 設定建立 prebuilt_etc_host 模組。確認 sub_dir 等於 cvd_custom_action_config

    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 中設定 Soong 設定建構變數,將虛擬裝置主機套件設定為包含自訂動作設定檔。

    # 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
    

導入自訂動作的方法有兩種:

  • ADB 殼層指令
  • 動作伺服器

JSON 設定檔可定義每種實作類型的多個例項。

ADB 殼層指令

您可以定義單一按鈕,方法是執行單一 adb shell 指令。舉例來說,下列 JSON 程式碼片段定義了啟動網頁的單一按鈕:

{
  "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:單一按鈕物件,包含下列子欄位:

動作伺服器

動作伺服器可進一步控管動作的行為。動作伺服器是主機二進位檔,會使用通訊端配對監聽 WebRTC 的按鈕按下事件。WebRTC 會將事件轉送至動作伺服器,然後動作伺服器會決定如何實作動作。

動作伺服器可提供更強大的控制功能,例如維護狀態 (例如可切換的事件),甚至執行「中繼動作」,例如終止目前裝置、啟動更多裝置,或啟動螢幕錄影瀏覽器擴充功能。只要您決定在主機二進位檔中實作,就能實現各種可能性。

下列 JSON 程式碼片段定義的動作伺服器會監聽兩個按鈕的事件:

{
  "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. 接受通訊端檔案描述元編號做為第一個也是唯一的程式引數。

    這個通訊端是由 launch_cvd 使用 socketpair 建立,其中包含網域 AF_LOCAL、類型 SOCK_STREAM 和通訊協定 0。

  2. 在迴圈中,嘗試從通訊端讀取 128 個位元組。這些位元組包含 WebRTC 用戶端傳送的按鈕按下事件,格式為 command:statecommand 是 JSON 設定中提供的內容,state 則是按鈕按下狀態 (downup)。

  3. 根據傳入的事件採取行動,模擬自訂動作。