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 仍然会被替换,以便测试可以在正确的引用上继续进行。每次设备断开/重新连接时(例如,在重启期间),都会无缝地完成此操作。