新裝置連線會觸發一系列非同步事件,這些事件不明顯,但值得瞭解。
已連線
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,以便測試能繼續使用適當的參照。每次裝置斷開/重新連線時 (例如重新啟動時),系統都會順暢地執行這項操作。