Geräteerkennung in Tradefed

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

Physisch verbunden

Tradefed verwendet die ddmlib-Bibliothek (eine Java-adb-Bibliothek), um die grundlegende Interaktion mit adb und Geräten zu ermöglichen. Ein 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 keine Daten mehr an adb sendet
  • deviceChanged: Wenn ein wichtiger Gerätestatus eintritt (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 den Testharness benötigen wir jedoch einen stabileren Status, um sicherzustellen, dass ein Gerät wirklich bereit ist, Tests auszuführen. Er sollte nicht durch mögliche Statusinstabilität beeinträchtigt werden, die bei einem neu verbundenen Gerät auftreten kann.

Das ist die Ereignisabfolge in Tradefed:

  1. Das Gerät wird als deviceConnected erkannt und ist für reguläre Ereignisse ab adb geöffnet.
  2. Es wird ein internes Tradefed-Ereignis erstellt, das Folgendes bewirkt:

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

    • OFFLINE: Das Gerät wird in den Tradefed-Status CONNECTED_OFFLINE versetzt, in dem noch keine Tests auf dem Gerät 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 (wie von adb gesehen): Das Gerät wird in den Status CONNECTED_ONLINE versetzt und seine Verfügbarkeit für die Testzuweisung 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 für die Zuweisung als unavailable 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.

Wichtig: 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, aber 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 über adb connect eine Verbindung dazu her. Dadurch wird das Gerät in adb devices normalerweise als <some ip>:<port number> angezeigt und folgt derselben Sequenz wie physisch verbundene Geräte.

Geräte-Tracking bei einem „deviceConnected“-Ereignis

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

Tradefed verwendet diese Referenz und umschließt sie mit einer eigenen Implementierung der Geräteschnittstelle ITestDevice, um erweiterte Dienste 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 dem richtigen Verweis fortgesetzt werden können. Das geschieht nahtlos jedes Mal, wenn ein Gerät getrennt oder wieder verbunden wird (z. B. bei einem Neustart).