Połączenie nowego urządzenia powoduje serię zdarzeń asynchronicznych, które nie są oczywiste, ale warto je poznać.
Połączenie fizyczne
Tradefed używa biblioteki ddmlib
(biblioteki Java adb
) do zapewnienia podstawowej interakcji z urządzeniami i usługą adb
. Rozwiązanie to obejmuje interfejs IDeviceChangeListener, który umożliwia odbiór nowych zdarzeń urządzenia, takich jak:
deviceConnected
: gdyadb
wykryje nowe urządzeniedeviceDisconnected
: gdy urządzenie przestaje raportować doadb
deviceChanged
: gdy nastąpi zmiana stanu urządzenia (np. urządzenie offline lub online).
Te zdarzenia na poziomie adb
wystarczają do określenia, czy urządzenie jest połączone, online czy offline. W przypadku testów potrzebujemy jednak bardziej szczegółowego stanu, aby mieć pewność, że urządzenie jest gotowe do rozpoczęcia testów. Nie może ono być podatne na potencjalne problemy ze stanem, które mogą wystąpić w przypadku nowo podłączonego urządzenia.
Oto sekwencja zdarzeń w Tradefed:
- Urządzenie jest rozpoznawane jako
deviceConnected
i otwarte na zwykłe zdarzenia zadb
Tworzone jest wewnętrzne zdarzenie Tradefed, które:
- Sprawdź, czy urządzenie jest już znane. Tradefed przechowuje wewnętrzne odniesienia do niektórych urządzeń (zwłaszcza do tego, które jest obecnie przypisane i w którym są przeprowadzane testy), aby uniknąć przypadkowego utraty ich śladu.
- Sprawdź, czy urządzenie jest
ONLINE
czyOFFLINE
.
Jeśli urządzenie:
OFFLINE
: urządzenie zostanie przełączone do stanuCONNECTED_OFFLINE
, który nie pozwala na przeprowadzanie testów. Jeśli urządzenie będzie online później, przejdzie przez cyklONLINE
. Jeśli otrzymamy zdarzeniedeviceDisconnect
, urządzenie zostanie po prostu usunięte z listy.ONLINE
(widoczne w adb): urządzenie zostanie przełączone do stanuCONNECTED_ONLINE
i jego dostępność zostanie sprawdzona na potrzeby testowej alokacji:checking_availability
.
Jeśli sprawdzenie
availability
zakończy się pomyślnie, urządzenie zostanie oznaczone jako dostępne do przydzielenia testów. Będzie można na nim przeprowadzać testy. W przeciwnym razie urządzenie zostanie oznaczone jakounavailable
i nie będzie mogło otrzymywać testów.
Wszystkie te stany są odzwierciedlane w konsoli Tradefed podczas wyświetlania urządzeń za pomocą: tf> list devices
Pamiętaj, że gdy urządzenie jest obecnie przypisane do testu, większość z tych czynności nie będzie wykonywana, a Tradefed określi stan urządzenia wewnętrznie. Dlatego urządzenie może zniknąć z adb devices
, ale nadal być widoczne w Tradefed. Może się tak zdarzyć, gdy test powoduje ponowne uruchomienie urządzenia.
Urządzenie wirtualne połączone za pomocą polecenia adb connect
Gdy zostanie utworzone zdalne urządzenie wirtualne, Tradefed łączy się z nim za pomocą adb
connect
. Zwykle spowoduje to wyświetlenie urządzenia w sekcji adb devices
jako <some ip>:<port number>
i będzie się uruchamiać w tej samej kolejności co urządzenia fizycznie połączone.
Śledzenie urządzenia po wystąpieniu zdarzenia deviceConnected
Gdy wystąpi deviceConnected
, ddmlib
utworzy nowe odwołanie IDevice, aby śledzić nowo podłączone urządzenie.
Tradefed używa tego odwołania i otula je w ramach własnej implementacji interfejsu urządzenia ITestDevice, aby zapewnić bardziej zaawansowaną obsługę. Jednak urządzenie IDevice jest zawsze tym, które pochodzi z ddmlib
.
Oznacza to, że jeśli nowe urządzenie zostanie połączone, zostanie utworzone nowe ITestDevice i powiązane z IDevice. Gdy dzieje się to podczas wywołania i użytkownik korzysta z ITestDevice, podrzędny IDevice jest nadal zastępowany, aby umożliwić przeprowadzenie testów na odpowiednim urządzeniu referencyjnym. Jest to wykonywane automatycznie za każdym razem, gdy urządzenie jest odłączane i ponownie łączone (np. podczas restartu).