Wykrywanie urządzeń w Tradefed

Połączenie z nowym urządzeniem wywołuje serię zdarzeń asynchronicznych, które nie są oczywiste, ale warto je poznać.

Połączenie fizyczne

Tradefed używa biblioteki ddmlib (biblioteki Java adb), aby zapewnić podstawową interakcję z adb i urządzeniami. Częścią tego rozwiązania jest interfejs IDeviceChangeListener, który umożliwia odbieranie nowych zdarzeń dotyczących urządzeń, takich jak:

  • deviceConnected: gdy adb wykryje nowe urządzenie,
  • deviceDisconnected: gdy urządzenie przestanie wysyłać raporty do adb.
  • deviceChanged: gdy wystąpi ważny stan urządzenia (np. urządzenie jest offline lub online);

Te zdarzenia na poziomie adb wystarczą, aby określić, czy urządzenie jest połączone, online czy offline. Jednak w przypadku platformy testowej potrzebujemy bardziej stabilnego stanu, aby mieć pewność, że urządzenie jest gotowe do rozpoczęcia testów. Nie powinien on być podatny na potencjalną niestabilność stanu, która może 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 wydarzenia od adb
  2. Zostanie utworzone wewnętrzne wydarzenie Tradefed, które:

    • Sprawdź, czy urządzenie jest już znane. Tradefed przechowuje wewnętrzne odniesienia do niektórych urządzeń (zwłaszcza tych, które są obecnie przydzielone i na których trwają testy), aby uniknąć przypadkowego utracenia ich śledzenia.
    • Sprawdź, czy urządzenie jest ONLINE czy OFFLINE.
  3. Jeśli urządzenie to:

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

    • ONLINE (widoczne dla adb): urządzenie zostanie przełączone w stan CONNECTED_ONLINE, a jego dostępność zostanie sprawdzona pod kątem przydzielenia do testów: checking_availability.

  4. Jeśli availability zakończy się pomyślnie, urządzenie zostanie oznaczone jako dostępne do przydzielenia do testów i będzie mogło je przeprowadzać. W przeciwnym razie urządzenie zostanie oznaczone jako unavailable i nie będzie można na nim przeprowadzać żadnych testów.

Wszystkie te stany są odzwierciedlone w konsoli Tradefed podczas wyświetlania listy urządzeń za pomocą polecenia: tf> list devices

Pamiętaj, że gdy urządzenie jest obecnie przydzielone do testu, większość z powyższych 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ę to zdarzyć na przykład wtedy, gdy test ponownie uruchamia urządzenie.

Urządzenie wirtualne połączone za pomocą polecenia adb connect

Gdy zostanie utworzone zdalne urządzenie wirtualne, Tradefed połączy się z nim za pomocą adb connect. Zwykle powoduje to wyświetlenie urządzenia w adb devices jako <some ip>:<port number> i następuje w tej samej kolejności co w przypadku urządzeń podłączonych fizycznie.

Śledzenie urządzenia, gdy wystąpi zdarzenie deviceConnected

Gdy wystąpi zdarzenie deviceConnected, ddmlib tworzy nowe odwołanie IDevice, aby śledzić nowo podłączone urządzenie.

Tradefed używa tego odwołania i zawiera je we własnej implementacji interfejsu urządzenia ITestDevice, aby zapewnić bardziej zaawansowaną usługę. Jednak urządzenie iD zawsze pochodzi od ddmlib.

Oznacza to, że po podłączeniu nowego urządzenia tworzony jest nowy obiekt ITestDevice, który jest powiązany z obiektem IDevice. Jeśli zdarzy się to podczas wywołania i używane jest urządzenie ITestDevice, bazowe urządzenie IDevice zostanie zastąpione, aby można było kontynuować testowanie na odpowiednim urządzeniu referencyjnym. Dzieje się to bezproblemowo za każdym razem, gdy urządzenie zostanie odłączone lub ponownie podłączone (np. podczas ponownego uruchamiania).