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. Dazu gehören:

  • 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 Zustand, um sicherzustellen, dass ein Gerät wirklich bereit ist, Tests auszuführen. Es sollte nicht durch potenzielle Instabilitäten des Zustands beeinträchtigt werden, die bei einem neu verbundenen Gerät auftreten können.

So sieht die Ereignisabfolge in Tradefed aus:

  1. Das Gerät wird als deviceConnected erkannt und ist für regelmäßige 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 speichert interne Verweise auf einige Geräte (insbesondere auf das derzeit zugewiesene und für Tests verwendete Gerät), damit TF nicht zufällig den Überblick über sie verliert.
    • Prüfen Sie, ob das Gerät ONLINE oder OFFLINE ist.
  3. Gerät:

    • OFFLINE: Das Gerät wird in den Tradefed-Status CONNECTED_OFFLINE versetzt. In diesem Fall können mit dem Gerät noch keine Tests ausgeführt werden. 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 Testzuweisung geprüft: checking_availability.

  4. Wenn die availability-Prüfung erfolgreich ist, wird das Gerät als verfügbar für die Testzuweisung markiert. Es können dann Tests ausgeführt werden. Andernfalls wird das Gerät für die Zuweisung als unavailable gekennzeichnet 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 von Tradefed aufgeführt wird. 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 virtuelles Remote-Gerät erstellt wird, stellt Tradefed über adb connect eine Verbindung zu diesem 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, wenn ein „deviceConnected“-Ereignis auftritt

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 ITestDevice verwendet wird, wird das zugrunde liegende IDevice trotzdem ersetzt, damit die Tests mit der richtigen Referenz fortgesetzt werden können. Dies erfolgt nahtlos, wenn ein Gerät getrennt oder wieder verbunden wird (z. B. während eines Neustarts).