設備外殼命令

在 VTS 測試期間,shell 命令用於執行目標端測試二進位文件,取得/設定屬性、環境變數和系統信息,以及啟動/停止 Android 框架。您可以使用adb shell命令或設備上執行的 VTS shell 驅動程式執行 VTS 設備 shell 命令(建議)。

使用亞行外殼

需要在測試期間關閉 USB 連接埠或重新啟動裝置的測試必須使用 ADB shell,因為如果沒有持久的 USB 連接,VTS shell 驅動程式將無法使用。您可以從 Python 測試腳本中的AndroidDevice物件呼叫 ADB shell。例子:

  • 取得 Android 裝置物件:
    self.device = self.android_devices[0]
    
  • 發出單一 shell 指令:
    result = self.device.adb.shell(‘ls')
    

使用 VTS shell 驅動程式

VTS shell 驅動程式是在裝置上執行並執行 shell 命令的代理程式二進位。預設情況下,如果驅動程式在設備上運行,VTS 將使用 shell 驅動程序,因為此方法比使用adb shell命令的延遲更短。

圖 1.VTS shell 驅動程式。

VTS 框架支援多裝置測試,其中每個 Android 裝置在基礎運行器中表示為 AndroidDevice 物件。預設情況下,VTS 框架將 VTS 代理程式和 VTS shell 驅動程式二進位檔案推送到每個 Android 設備,並與這些設備上的 VTS 代理建立 TCP 連線。

為了執行 shell 指令,主機端 Python 腳本會對 AndroidDevice 物件內的 ShellMirror 物件進行函數呼叫。 ShellMirror 物件將 shell 命令文字打包到protobuf訊息中,並將其(透過 TCP 通道)傳送至 Android 裝置上的 VTS 代理程式。然後,在裝置上執行的代理程式透過 Unix 套接字將 shell 命令轉送至 VTS shell 驅動程式。

當 VTS shell 驅動程式收到 shell 命令時,它會透過裝置 shell 上的nohup執行該命令以防止暫停。然後從nohup檢索標準輸出、標準錯誤和返回代碼並將其發送回 VTS 代理。最後,代理程式透過將命令結果包裝到protobuf訊息中來回覆主機。

優點

使用 VTS shell 驅動程式而不是adb shell的優點包括:

  • 可靠性。 VTS shell 驅動程式使用nohup在預設設定下執行命令。由於 VTS 測試主要是較低層級的 HAL 和核心測試, nohup確保 ​​shell 命令在執行期間不會掛起。
  • 表現。雖然adb shell命令會快取一些結果(例如列出目錄中的檔案),但在執行測試二進位等任務時,它會產生連線開銷。 VTS shell 驅動程式在整個測試過程中保持活動連接,因此唯一的開銷是 USB 通訊。在我們的測試中,使用 VTS shell 驅動程式執行對空 gtest 二進位檔案進行 100 次呼叫的命令比使用adb shell快約 20%;實際差異更大,因為 VTS shell 通訊具有廣泛的日誌記錄。
  • 狀態保持。 VTS shell 驅動程式為每個終端名稱維護一個終端會話(預設終端名稱為default )。在一個終端機會話中設定的環境變數僅可用於同一會話中的後續命令。
  • 可擴展。 VTS 框架和裝置驅動程式之間的 Shell 命令通訊封裝在 protobuf 中,以便將來實現潛在的壓縮、遠端處理、加密等。還可以使用其他提高效能的可能性,包括當通訊開銷變得大於結果字串解析時的設備端結果解析。

缺點

使用 VTS shell 驅動程式而不是adb shell的缺點包括:

  • 附加二進位檔案。 VTS 代理檔案必須推送到裝置並在測試執行後清理。
  • 需要主動連線。如果在測試過程中主機和代理程式之間的 TCP 連線有意或無意地遺失(由於 USB 中斷、連接埠關閉、裝置崩潰等),則 shell 命令無法傳送至 VTS Agent。即使自動切換到adb shell ,斷開連線先前指令的結果和狀態也是未知的。

例子

在 VTS 主機端 Python 測試腳本中使用 shell 指令的範例:

  • 取得 Android 裝置物件:
    self.device = self.android_devices[0]
    
  • 取得所選設備的 shell 物件:
    self.shell = self.device.shell
    
  • 發出單一 shell 指令:
    results = self.shell.Execute(‘ls')
    
  • 發出 shell 指令清單:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

命令結果對象

shell 指令執行的回傳物件是一個包含鍵stdoutsstderrsreturn_codes的字典。無論 shell 命令是以單一字串還是命令字串列表的形式提供,結果字典的每個值始終是一個列表。

若要驗證指令清單的回傳碼,測試腳本必須檢查索引。例子:

asserts.assertFalse(any(results[‘return_codes']), ‘some command failed.')

或者,腳本可以單獨檢查每個命令索引。例子:

asserts.assertEqual(results[‘return_codes'][0], 0, ‘first command failed')
asserts.assertEqual(results[‘return_codes'][1], 0, ‘second command failed')