一個新的設備連接會觸發一系列不明顯但值得理解的異步事件。
物理連接
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,因此可以在正確的引用上繼續進行測試。每次斷開/重新連接設備(例如,在重新啟動期間)時,都會無縫完成此操作。