Tradefed 中的裝置偵測

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

已連線

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

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

這些事件在 adb 層級就足以判斷裝置是否已連線、上線或離線。不過,對於測試輔助工具,我們需要更強大的狀態,以確保裝置確實已準備好開始執行測試;它不應受到新連線裝置可能帶來的潛在狀態不穩定情形影響。

以下是 Tradefed 中的事件順序:

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

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

    • OFFLINE:裝置會切換至 Tradefed CONNECTED_OFFLINE 狀態,這會導致裝置無法執行測試。如果裝置稍後連上網路,就會進入 ONLINE 週期。如果我們收到 deviceDisconnect 事件,裝置就會從清單中移除。

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

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