Tradefed 中的裝置偵測

新裝置連線會觸發一系列非同步事件,這些事件不明顯,但值得瞭解。

實體連線

交易會使用 ddmlib 程式庫 (Java adb 程式庫) 提供與 adb 和裝置的基本互動。本解決方案的一部分是 IDeviceChangeListener 介面,可讓系統接收新裝置事件,例如:

  • deviceConnectedadb 偵測到新裝置時
  • deviceDisconnected:裝置不再回報給adb
  • deviceChanged:發生重大裝置狀態 (例如裝置離線或裝置上線) 時

這些事件在 adb 層級就足以判斷裝置是否已連線、上線或離線。但是,就測試控管而言,我們需要比此更高的狀態,以確保裝置準備就緒,可以開始執行測試。它不應因為新連線裝置中的潛在狀態不穩定而受到影響。

以下是 Tradefed 中的事件順序:

  1. 裝置會被視為 deviceConnected,並開放 adb 的一般事件
  2. 系統會建立內部 Tradefed 事件,以便執行以下操作:

    • 檢查裝置是否已知;Tradefed 會保留部分裝置的內部參照 (尤其是目前已指派並執行測試的裝置),以免 TF 隨機遺失裝置。
    • 檢查裝置是否為 ONLINEOFFLINE
  3. 如果裝置為:

    • OFFLINE:裝置將切換為「換購」的 CONNECTED_OFFLINE 狀態,該狀態尚不允許裝置執行測試。如果裝置稍後連上網路,就會進入 ONLINE 週期。如果我們收到 deviceDisconnect 事件,裝置就會從清單中移除。

    • ONLINE (由 ADB 顯示):裝置會處於 CONNECTED_ONLINE 狀態,並檢查其可用性,以便進行測試分配:checking_availability

  4. 如果 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,以便測試能繼續使用適當的參照。每次裝置斷開/重新連線時 (例如重新啟動時),系統都會順利執行這項作業。