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

動作伺服器

行動伺服器可讓您進一步控管動作的行為。動作伺服器是主機二進位檔,可使用 Socket 組合監聽 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 使用,網域為 AF_LOCAL、類型 SOCK_STREAM 和通訊協定 0 的 socketpair 所建立。

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

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