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