Google致力於提高黑人社區的種族平等。 怎麼看。
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

設備外殼命令

在VTS測試期間,shell命令用於執行目標端測試二進製文件,獲取/設置屬性,環境變量和系統信息,以及啟動/停止Android框架。您可以使用adb shell命令或設備上運行的VTS Shell驅動程序執行VTS設備Shell命令(推薦)。

使用ADB 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使用外殼程序驅動程序,因為此方法的延遲比使用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命令時,它將通過nohup在設備Shell上執行該命令以防止掛起。然後從nohup檢索Stdout,stderr和返回碼,並將其發送回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代理。即使自動切換到adb shell ,斷開連接前命令的結果和狀態也將是未知的。

例子

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

  • 獲取一個Android設備對象:
    self.device = self.android_devices[0]
    
  • 獲取所選設備的外殼程序對象:
    self.shell = self.device.shell
    
  • 發出單個shell命令:
    results = self.shell.Execute(‘ls')
    
  • 發出shell命令列表:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

命令結果對象

Shell命令執行的返回對stdouts一個包含鍵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')