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 以供分配,且無法接收任何測試。

透過 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,因此測試可以繼續進行適當的參照。每次裝置中斷連線/重新連線時 (例如重新啟動時),系統都會順暢地執行這項操作。