新裝置連線會觸發一系列非同步事件,這些事件不明顯,但值得瞭解。
實體連線
交易會使用 ddmlib
程式庫 (Java adb
程式庫) 提供與 adb
和裝置的基本互動。本解決方案的一部分是 IDeviceChangeListener 介面,可讓系統接收新裝置事件,例如:
deviceConnected
:adb
偵測到新裝置時deviceDisconnected
:裝置不再回報給adb
時deviceChanged
:發生重大裝置狀態 (例如裝置離線或裝置上線) 時
這些事件在 adb
層級就足以判斷裝置是否已連線、上線或離線。但是,就測試控管而言,我們需要比此更高的狀態,以確保裝置準備就緒,可以開始執行測試。它不應因為新連線裝置中的潛在狀態不穩定而受到影響。
以下是 Tradefed 中的事件順序:
- 裝置會被視為
deviceConnected
,並開放adb
的一般事件 系統會建立內部 Tradefed 事件,以便執行以下操作:
- 檢查裝置是否已知;Tradefed 會保留部分裝置的內部參照 (尤其是目前已指派並執行測試的裝置),以免 TF 隨機遺失裝置。
- 檢查裝置是否為
ONLINE
或OFFLINE
。
如果裝置為:
OFFLINE
:裝置將切換為「換購」的CONNECTED_OFFLINE
狀態,該狀態尚不允許裝置執行測試。如果裝置稍後連上網路,就會進入ONLINE
週期。如果我們收到deviceDisconnect
事件,裝置就會從清單中移除。ONLINE
(由 ADB 顯示):裝置會處於CONNECTED_ONLINE
狀態,並檢查其可用性,以便進行測試分配:checking_availability
。
如果
availability
檢查成功,裝置就會標示為可用於測試分配,並可執行測試。如果沒有,裝置會標示為unavailable
以便分配,且無法接收任何測試。
透過以下方式列出裝置時,所有這些狀態都會顯示在 Tradefed 控制台:tf> list devices
請特別注意,目前裝置分配給測試時,系統大多不會發生上述情形,因此交易會判斷裝置內部的裝置狀態。因此,裝置可能會從 adb devices
中消失,但仍會列於 Tradefed 中。舉例來說,如果測試重新啟動裝置,就可能發生這種情況。
透過 ADB Connect 連線的虛擬裝置
遠端虛擬裝置建立完成後,Tradefed 會透過 adb
connect
連線至該裝置。這通常會觸發裝置在 adb devices
中顯示為 <some ip>:<port number>
,並按照與實體連接裝置相同的順序進行。
發生裝置連線事件時的裝置追蹤
發生 deviceConnected
時,ddmlib
會建立新的參照 IDevice,以追蹤新連線的裝置。
交易時會使用這個參照,並包裝在專屬的裝置介面 ITestDevice 實作中,以提供更進階的服務。但基礎 IDevice 一律來自 ddmlib
。
也就是說,如果有新裝置連線,系統會建立新的 ITestDevice,並與 IDevice 建立關聯。如果在叫用期間發生這種情況,且正在使用 ITestDevice,則系統仍會替換底層 IDevice,以便測試能繼續使用適當的參照。每次裝置斷開/重新連線時 (例如重新啟動時),系統都會順利執行這項作業。