新裝置連線會觸發一連串非同步事件,這些事件目前並不顯眼,但值得瞭解。
實體連線
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
以供分配,且無法接收任何測試。
透過 tf> list devices
列出裝置時,Tradefed 控制台會反映所有這些狀態。
請注意,如果裝置目前已分配用於測試,則上述大部分情況都不會發生,且 Tradefed 會在內部判斷裝置狀態。因此,裝置可能會從 adb devices
中消失,但仍列在 Tradefed 中。舉例來說,測試重新啟動裝置時,就可能發生這種情況。
透過 adb connect 連線的虛擬裝置
建立遠端虛擬裝置時,Tradefed 會使用 adb
connect
連線至該裝置。這通常會觸發裝置在 adb devices
中顯示為 <some ip>:<port number>
,並遵循與實體連接裝置相同的順序。
裝置連線事件發生時的裝置追蹤
發生 deviceConnected
時,ddmlib
會建立新的 IDevice 參考,追蹤新連線的裝置。
Tradefed 會使用該參照,並將其包裝在裝置介面 ITestDevice 的自有實作項目中,以提供更進階的服務。但底層 IDevice 一律來自 ddmlib
。
也就是說,如果連線的是新裝置,系統會建立新的 ITestDevice,並與 IDevice 建立關聯。如果是在呼叫期間發生這種情況,且正在使用 ITestDevice,系統仍會替換基礎 IDevice,因此測試可以繼續進行適當的參照。每次裝置中斷連線/重新連線時 (例如重新啟動時),系統都會順暢地執行這項操作。