Geräteerkennung in Tradefed

Eine neue Geräteverbindung löst eine Reihe asynchroner Ereignisse aus, die nicht offensichtlich, aber dennoch verständlich sind.

Physisch verbunden

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

  • deviceConnected : Wenn ein neues Gerät von adb erkannt wird
  • deviceDisconnected : Wenn ein Gerät sich 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. Aber für die Testumgebung benötigen wir einen stärkeren Zustand als diesen, um sicherzustellen, dass ein Gerät wirklich bereit ist, mit der Durchführung von Tests zu beginnen; Es sollte nicht durch mögliche Zustandsschwankungen beeinträchtigt werden, die bei einem neu angeschlossenen Gerät auftreten können.

Dies ist der Ablauf der Ereignisse in Tradefed:

  1. Das Gerät wird als deviceConnected erkannt und ist für regelmäßige Ereignisse von adb geöffnet
  2. Es wird ein internes Tradefed-Event erstellt, das Folgendes bewirkt:

    • Prüfen Sie, ob das Gerät bereits bekannt ist; Tradefed behält interne Referenzen zu einigen Geräten (insbesondere zu dem Gerät, das aktuell zugewiesen ist und Tests ausführt), um zu verhindern, dass TF sie zufällig aus den Augen verliert.
    • Überprüfen Sie, ob das Gerät ONLINE oder OFFLINE ist.
  3. Wenn das Gerät:

    • OFFLINE : Das Gerät wird in den Tradefed CONNECTED_OFFLINE Status versetzt, wodurch das Gerät noch keine Tests ausführen kann. 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 (wie von adb gesehen): Das Gerät wird in den Status CONNECTED_ONLINE versetzt und seine Verfügbarkeit wird für die Testzuordnung überprüft: checking_availability .

  4. Bei erfolgreicher availability wird das Gerät als für die Testzuteilung verfügbar markiert; Es wird in der Lage sein, Tests durchzuführen. Andernfalls wird das Gerät als unavailable für die Zuweisung verfügbar markiert und kann keine Tests empfangen.

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

Es ist wichtig zu beachten, dass die meisten der oben genannten Probleme nicht auftreten, wenn das Gerät aktuell für einen Test zugewiesen ist und Tradefed den Gerätestatus intern ermittelt. Daher ist es möglich, dass ein Gerät aus adb devices verschwindet, während es weiterhin von Tradefed gelistet wird. Dies kann beispielsweise passieren, wenn bei einem Test das Gerät neu gestartet wird.

Virtuelles Gerät mit ADB Connect verbunden

Wenn ein virtuelles Remote-Gerät erstellt wird, stellt Tradefed mithilfe von adb connect eine Verbindung zu diesem her. Dies führt normalerweise dazu, dass das Gerät in adb devices als <some ip>:<port number> angezeigt wird und der gleichen Reihenfolge folgt wie physisch verbundene Geräte.

Geräteverfolgung, wenn ein deviceConnected-Ereignis auftritt

Wenn deviceConnected auftritt, erstellt ddmlib ein neues Referenz- IDevice , um das neu verbundene Gerät zu verfolgen.

Tradefed verwendet diese Referenz und bindet sie in seine eigene Implementierung der Geräteschnittstelle ITestDevice ein, um einen erweiterten Service bereitzustellen. Aber das zugrunde liegende IDevice ist immer dasjenige, das von ddmlib stammt.

Das heißt, wenn ein neues Gerät angeschlossen wird, wird ein neues ITestDevice erstellt und dem IDevice zugeordnet. Wenn dies während eines Aufrufs geschieht und das ITestDevice verwendet wird, wird das zugrunde liegende IDevice trotzdem ersetzt, sodass der Test mit der richtigen Referenz fortgesetzt werden kann. Dies erfolgt nahtlos jedes Mal, wenn ein Gerät getrennt/wieder verbunden wird (z. B. während eines Neustarts).