Geräteerkennung in Tradefed

Eine neue Geräteverbindung löst eine Reihe asynchroner Ereignisse aus, die nicht offensichtlich sind, aber verstanden werden sollten.

Physisch verbunden

Tradefed verwendet die ddmlib-Bibliothek (eine Java-adb-Bibliothek), um die grundlegende Interaktion mit adb und Geräten zu ermöglichen. Teil dieser Lösung ist die IDeviceChangeListener-Schnittstelle die den Empfang neuer Geräteereignisse ermöglicht, z. B.:

  • deviceConnected: Wenn ein neues Gerät von adb erkannt wird
  • deviceDisconnected: Wenn ein Gerät nicht mehr an adb meldet
  • deviceChanged: Wenn ein wichtiger Gerätestatus auftritt (z. B. Gerät offline oder Gerät online)

Diese Ereignisse reichen auf adb-Ebene aus, um zu entscheiden, ob ein Gerät verbunden, online oder offline ist. Für die Testumgebung benötigen wir jedoch einen stärkeren Status, um sicherzustellen, dass ein Gerät wirklich bereit ist, Tests auszuführen. Es sollte nicht durch potenzielle Statusinstabilität beeinträchtigt werden, die bei einem neu verbundenen Gerät auftreten kann.

Dies ist die Ereignisabfolge in Tradefed:

  1. Das Gerät wird als deviceConnected erkannt und ist für reguläre Ereignisse von adb offen.
  2. Es wird ein internes Tradefed-Ereignis erstellt, das Folgendes ausführt:

    • Prüfen, ob das Gerät bereits bekannt ist. Tradefed behält eine interne Referenz auf einige Geräte (insbesondere auf das aktuell zugewiesene und laufende Tests), um zu vermeiden, dass TF sie zufällig verliert.
    • Prüfen, ob das Gerät ONLINE oder OFFLINE ist.
  3. Wenn das Gerät:

    • OFFLINE ist, wird es in den Tradefed-Status CONNECTED_OFFLINE versetzt, in dem noch keine Tests ausgeführt werden können. Wenn das Gerät später online ist, durchläuft es den ONLINE-Zyklus. Wenn wir ein deviceDisconnect-Ereignis erhalten, wird das Gerät einfach aus der Liste entfernt.

    • ONLINE ist (wie von adb gesehen), wird es in den Status CONNECTED_ONLINE versetzt und seine Verfügbarkeit für die Test zuweisung wird geprüft: checking_availability.

  4. Wenn die availability-Prüfung erfolgreich ist, wird das Gerät als für die Testzuweisung verfügbar markiert und kann Tests ausführen. Andernfalls wird das Gerät als unavailable für die Zuweisung markiert und kann keine Tests empfangen.

Alle diese Status werden in der Tradefed-Konsole angezeigt, wenn die Geräte über tf> list devices aufgelistet werden.

Wenn das Gerät derzeit für einen Test zugewiesen ist, treten die meisten der oben genannten Schritte nicht auf und Tradefed bestimmt den Gerätestatus intern. Es ist also möglich, dass ein Gerät aus adb devices verschwindet, während es weiterhin von Tradefed aufgeführt wird. Das kann beispielsweise passieren, wenn ein Test das Gerät neu startet.

Virtuelles Gerät mit adb connect verbunden

Wenn ein virtuelles Remote-Gerät erstellt wird, stellt Tradefed mit adb connect eine Verbindung dazu her. Dadurch wird das Gerät normalerweise in adb devices als <some ip>:<port number> angezeigt und folgt derselben Sequenz wie physisch verbundene Geräte.

Geräte-Tracking, wenn ein deviceConnected-Ereignis auftritt

Wenn deviceConnected auftritt, erstellt ddmlib eine neue Referenz IDevice , um das neu verbundene Gerät zu verfolgen.

Tradefed verwendet diese Referenz und umschließt sie in seiner eigenen Implementierung der Geräteschnittstelle ITestDevice , um einen erweiterten Dienst bereitzustellen. Die zugrunde liegende IDevice stammt jedoch immer von ddmlib.

Wenn also ein neues Gerät verbunden wird, wird ein neues ITestDevice erstellt und mit dem IDevice verknüpft. Wenn dies während eines Aufrufs geschieht und das ITestDevice verwendet wird, wird das zugrunde liegende IDevice trotzdem ersetzt, damit die Tests mit der richtigen Referenz fortgesetzt werden können. Dies geschieht nahtlos jedes Mal, wenn ein Gerät getrennt und wieder verbunden wird (z. B. während eines Neustarts).