Geräteerkennung in Tradefed

Eine neue Geräteverbindung löst eine Reihe von asynchronen Ereignissen aus, die nicht offensichtlich sind, 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 adb ein neues Gerät erkennt
  • deviceDisconnected: Wenn ein Gerät keine Berichte mehr an adb sendet
  • 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 den Test-Harness benötigen wir jedoch einen stabileren Status, um sicherzustellen, dass ein Gerät wirklich bereit ist, Tests auszuführen. Es sollte nicht durch potenzielle Statusschwankungen beeinträchtigt werden, die bei einem neu verbundenen Gerät auftreten können.

Das ist die Ereignisabfolge 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-Ereignis erstellt, das Folgendes bewirkt:

    • Prüfen Sie, ob das Gerät bereits bekannt ist. Tradefed speichert interne Verweise auf einige Geräte (insbesondere auf das derzeit zugewiesene und laufende Gerät), damit TF nicht zufällig den Überblick verliert.
    • Prüfen Sie, ob das Gerät ONLINE oder OFFLINE ist.
  3. Wenn das Gerät:

    • OFFLINE: Das Gerät wird in den Status „Tradefed“ CONNECTED_OFFLINE umgeschaltet, wodurch auf dem Gerät 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 (wie von adb gesehen): Das Gerät wird in den Status CONNECTED_ONLINE versetzt und seine Verfügbarkeit für die Testzuweisung geprüft: checking_availability.

  4. Wenn die Prüfung für availability 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 erhalten.

Alle diese Status werden in der Tradefed-Konsole angezeigt, wenn die Geräte über eine der folgenden Methoden aufgeführt werden: tf> list devices

Wenn das Gerät derzeit für einen Test zugewiesen ist, tritt die Mehrzahl der oben genannten Fälle nicht auf und Tradefed bestimmt den Gerätestatus intern. Es kann also sein, dass ein Gerät aus adb devices verschwindet, aber weiterhin bei Tradefed aufgeführt ist. Das kann beispielsweise passieren, wenn das Gerät während eines Tests neu gestartet wird.

Virtuelles Gerät, das über adb connect verbunden ist

Wenn ein Remote-virtuelles Gerät erstellt wird, stellt Tradefed über adb connect eine Verbindung zu ihm her. Dadurch wird in der Regel das Gerät ausgelöst, das in adb devices als <some ip>:<port number> angezeigt wird. Es folgt derselben Abfolge wie physisch verbundene Geräte.

Geräte-Tracking bei einem deviceConnected-Ereignis

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

Tradefed verwendet diese Referenz und umhüllt sie in seiner eigenen Implementierung der Geräteschnittstelle ITestDevice, um einen erweiterten Dienst bereitzustellen. Das zugrunde liegende IDevice ist jedoch immer das, das von ddmlib stammt.

Wenn also ein neues Gerät verbunden wird, wird ein neues ITestDevice erstellt und mit dem IDevice verknüpft. Wenn dies während einer Aufrufung auftritt 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 jedes Mal nahtlos, wenn ein Gerät getrennt und wieder verbunden wird (z. B. bei einem Neustart).