Обнаружение устройств в Tradefed

Подключение нового устройства запускает ряд асинхронных событий, которые неочевидны, но заслуживают понимания.

Физически подключен

Tradefed использует библиотеку ddmlib (библиотека Java adb ) для обеспечения базового взаимодействия с adb и устройствами. Частью этого решения является интерфейс IDeviceChangeListener , который позволяет получать новые события устройств, такие как:

  • deviceConnected : когда adb видит новое устройство
  • deviceDisconnected : Когда устройство больше не отправляет отчеты в adb
  • deviceChanged : При возникновении важного состояния устройства (например, устройство отключено или устройство подключено)

Этих событий достаточно на уровне adb , чтобы решить, подключено ли устройство, находится ли оно в сети или нет. Но для тестового оборудования нам нужно более сильное состояние, чем это, чтобы гарантировать, что устройство действительно готово к запуску тестов; на него не должна влиять потенциальная нестабильность состояния, которая может возникнуть с недавно подключенным устройством.

Вот последовательность событий в Tradefed:

  1. Устройство распознается как устройство, deviceConnected и открытое для обычных событий от adb
  2. Создается внутреннее событие Tradefed, которое:

    • Проверьте, известно ли уже устройство; Tradefed сохраняет внутреннюю ссылку на некоторые устройства (особенно на то, которое в данный момент выделено и выполняет тесты), чтобы избежать случайной потери их отслеживания TF.
    • Проверьте, находится ли устройство ONLINE или OFFLINE .
  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 все равно заменяется, поэтому тестирование может продолжаться на правильной ссылке. Это делается бесшовно каждый раз, когда устройство отключается/подключается повторно (например, во время перезагрузки).