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