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