一個新的設備連接會觸發一系列不明顯但值得理解的異步事件。
物理連接
Tradefed 使用ddmlib庫(Java adb庫)提供與adb和設備的基本交互。該解決方案的一部分是允許接收新設備事件的IDeviceChangeListener 接口,例如:
-
deviceConnected:當adb看到新設備時 deviceDisconnected:當設備不再向adb報告時deviceChanged:當設備發生主要狀態時(例如設備離線或設備在線)
這些事件在adb級別足以決定設備是否已連接、在線或離線。但是對於測試工具,我們需要一個比這更強大的狀態來確保設備真正準備好開始運行測試;它不應受到新連接設備可能帶來的潛在狀態不穩定的影響。
這是 Tradefed 中的事件順序:
- 設備被識別為
deviceConnected並對來自adb的常規事件開放 將創建一個內部 Tradefed 事件,該事件將:
- 檢查設備是否已知; Tradefed 保留對某些設備的內部引用(尤其是當前分配和運行的測試),以避免 TF 隨機丟失對它們的跟踪。
- 檢查設備是
ONLINE還是OFFLINE。
如果設備是:
OFFLINE: 設備將切換到 TradefedCONNECTED_OFFLINE狀態,這還不允許設備運行測試。如果設備稍後在線,它將進入ONLINE週期。如果我們收到deviceDisconnect事件,該設備將簡單地從列表中刪除。ONLINE(如 adb 所見):設備將置於狀態CONNECTED_ONLINE並將檢查其可用性以進行測試分配:checking_availability。
如果
availability檢查成功,設備將被標記為可用於測試分配;它將能夠運行測試。否則,該設備將被標記為unavailable分配,並且無法接收任何測試。
通過以下方式列出設備時,所有這些狀態都會反映在 Tradefed 控制台中: tf> list devices
需要注意的是,當設備當前被分配用於測試時,上述大部分情況都不會發生,Tradefed 將在內部確定設備狀態。因此,設備可能會從adb devices中消失,同時仍被 Tradefed 列出。例如,當測試重新啟動設備時,可能會發生這種情況。
通過“adb connect”連接的虛擬設備
創建遠程虛擬設備後,Tradefed 使用adb connect連接到它。這通常會觸發在adb devices中顯示為<some ip>:<port number>的設備,並將遵循與物理連接設備相同的順序。
發生deviceConnected事件時的設備跟踪
當deviceConnected發生時, ddmlib創建一個新的引用IDevice來跟踪新連接的設備。
Tradefed 使用該引用並將其包裝在自己的設備接口ITestDevice實現中,以提供更高級的服務。但底層的 IDevice 始終是來自ddmlib的那個。
這意味著如果連接了新設備,則會創建一個新的 ITestDevice 並將其與 IDevice 關聯。如果在調用期間發生這種情況並且正在使用 ITestDevice,則仍會替換底層 IDevice,因此可以在正確的引用上繼續進行測試。每次斷開/重新連接設備(例如,在重新啟動期間)時,都會無縫完成此操作。