Tradefed 中的設備檢測

新的設備連接會觸發一系列不明顯但值得理解的非同步事件。

實體連接

Tradefed 使用ddmlib函式庫(一個 Java adb函式庫)提供與adb和裝置的基本互動。此解決方案的一部分是IDeviceChangeListener 接口,它允許接收新裝置事件,例如:

  • deviceConnected :當adb發現新裝置時
  • 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 仍會被替換,以便測試可以在正確的引用上繼續進行。每次裝置中斷/重新連線(例如,重新啟動期間)時,都會無縫完成此操作。