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

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

Физически соединены

Tradefed использует библиотеку ddmlib (библиотеку adb для Java) для обеспечения базового взаимодействия с 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 все равно заменяется, чтобы тестирование могло продолжаться на правильной ссылке. Это происходит автоматически каждый раз при отключении/повторном подключении устройства (например, во время перезагрузки).