Wykrywanie urządzeń w Tradefed

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: gdy adb wykryje nowe urządzenie
  • deviceDisconnected: gdy urządzenie przestaje raportować do adb
  • 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:

  1. Urządzenie jest rozpoznawane jako deviceConnected i otwarte na zwykłe zdarzenia z adb
  2. 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 czy OFFLINE.
  3. Jeśli urządzenie:

    • OFFLINE: urządzenie zostanie przełączone do stanu CONNECTED_OFFLINE, który nie pozwala na przeprowadzanie testów. Jeśli urządzenie będzie online później, przejdzie przez cykl ONLINE. Jeśli otrzymamy zdarzenie deviceDisconnect, urządzenie zostanie po prostu usunięte z listy.

    • ONLINE (widoczne w adb): urządzenie zostanie przełączone do stanu CONNECTED_ONLINE i jego dostępność zostanie sprawdzona na potrzeby testowej alokacji: checking_availability.

  4. 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 jako unavailable 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).