Wykrywanie urządzeń w Tradefed

Nowe połączenie urządzenia powoduje serię zdarzeń asynchronicznych, które nie są oczywiste, ale warto je poznać.

Fizyczne połączenie

Tradefed używa biblioteki ddmlib (biblioteki Java adb) do zapewnienia podstawowej interakcji z urządzeniami i usługą adb. Częścią tego rozwiązania jest interfejs IDeviceChangeListener, który umożliwia odbieranie nowych zdarzeń dotyczących 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 ramach Tradefed:

  1. Urządzenie jest rozpoznawane jako deviceConnected i otwarte na zwykłe zdarzenia z adb
  2. Zostanie utworzone wewnętrzne zdarzenie Tradefed, które:

    • Sprawdź, czy urządzenie jest już znane. Tradefed zachowuje wewnętrzne odniesienie do niektórych urządzeń (zwłaszcza tego, które jest obecnie przydzielone i trwa testy), aby zapobiec przypadkowej utracie ich przez TF.
    • Sprawdź, czy urządzenie jest ONLINE czy OFFLINE.
  3. Jeśli urządzenie:

    • OFFLINE: urządzenie zostanie przełączone na stan CONNECTED_OFFLINE Tradefed, co nie umożliwia jeszcze na nim przeprowadzania testów. Jeśli urządzenie będzie później online, przejdzie cykl ONLINE. Jeśli otrzymamy zdarzenie deviceDisconnect, urządzenie zostanie po prostu usunięte z listy.

    • ONLINE (z perspektywy 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 kontrola availability zakończy się powodzeniem, urządzenie zostanie oznaczone jako dostępne do przydziału testów i będzie mogło 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. Możliwe więc, że urządzenie zniknie z adb devices, wciąż będzie widoczne na liście Tradefed. Może się tak zdarzyć, gdy test powoduje ponowne uruchomienie urządzenia.

Urządzenie wirtualne połączone za pomocą adb Connect

Po utworzeniu zdalnego urządzenia wirtualnego 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>. Następnie nastąpi ta sama sekwencja jak w przypadku urządzeń fizycznie połączonych.

Ś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 opakowuje je w ramach własnej implementacji interfejsu urządzenia ITestDevice, aby zapewnić bardziej zaawansowaną obsługę. Jednak podstawowa karta IDevice jest zawsze ta pochodząca 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ę tak 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).