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