新的设备连接会触发一系列异步事件,这些事件并不明显,但值得了解。
物理连接
Tradefed 使用 ddmlib
库(Java adb
库)来提供与 adb
和设备的基本交互。此解决方案的一部分是 IDeviceChangeListener 接口,该接口允许接收新的设备事件,例如
deviceConnected
:当adb
看到新设备时deviceDisconnected
:当设备不再向adb
报告时deviceChanged
:当发生主要设备状态时(例如设备离线或设备在线)
在 adb
级别,这些事件足以决定设备是否已连接、在线或离线。但对于测试框架,我们需要比这更强的状态,以确保设备真正准备好开始运行测试;它不应受到新连接设备可能带来的潜在状态不稳定的影响。
这是 Tradefed 中的事件序列
- 设备被识别为
deviceConnected
,并向adb
开放定期事件 将创建一个内部 Tradefed 事件,该事件将
- 检查设备是否已知;Tradefed 保留对某些设备的内部引用(尤其是当前已分配和正在运行测试的设备),以避免 TF 随机丢失对它们的跟踪。
- 检查设备是否为
ONLINE
或OFFLINE
。
如果设备为
OFFLINE
:设备将切换到 TradefedCONNECTED_OFFLINE
状态,该状态不允许设备运行测试。如果设备稍后在线,它将经历ONLINE
周期。如果我们收到deviceDisconnect
事件,设备将仅从列表中移除。ONLINE
(如 adb 所见):设备将置于CONNECTED_ONLINE
状态,并将检查其可用性以进行测试分配:checking_availability
。
如果
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 仍然会被替换,以便测试可以在正确的引用上继续进行。每次设备断开/重新连接时(例如,在重启期间),都会无缝地完成此操作。