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 vonadberkannt wirddeviceDisconnected: Wenn ein Gerät nicht mehr anadbmeldetdeviceChanged: 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:
- Das Gerät wird als
deviceConnectederkannt und ist für reguläre Ereignisse vonadboffen. 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
ONLINEoderOFFLINEist.
Wenn das Gerät:
OFFLINEist, wird es in den Tradefed-StatusCONNECTED_OFFLINEversetzt, in dem noch keine Tests ausgeführt werden können. Wenn das Gerät später online ist, durchläuft es denONLINE-Zyklus. Wenn wir eindeviceDisconnect-Ereignis erhalten, wird das Gerät einfach aus der Liste entfernt.ONLINEist (wie von adb gesehen), wird es in den StatusCONNECTED_ONLINEversetzt und seine Verfügbarkeit für die Test zuweisung wird geprüft:checking_availability.
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 alsunavailablefü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).