Tradefed でのデバイス検出

新しいデバイスを接続すると、一連の非同期的なイベントが起動します。これらのイベントは理解しづらいものの、理解しておくと役に立ちます。

物理的に接続した場合

Tradefed は、adb およびデバイスとの基本的なインタラクションに ddmlib ライブラリ(Java adb ライブラリ)を使用します。このソリューションには、次のような新しいデバイス イベントの受信を可能にする IDeviceChangeListener インターフェースが使用されています。

  • deviceConnected: 新しいデバイスが adb によって検出されたときのイベント
  • deviceDisconnected: デバイスがこれ以降 adb にレポートを送信しなくなるときのイベント
  • deviceChanged: デバイスの状態に重要な変化が発生したときのイベント(デバイスのオフラインやオンラインなど)

デバイスが接続中、オンライン、またはオフラインであるかを adb レベルで判断するためには、上記のイベントで十分です。しかし、テストハーネスでは、デバイスでテストを確実に実行できるようにするために、これよりもさらに強力な状態が必要です。つまり、新しく接続するデバイスで発生する可能性がある不安定な状態に影響を受けないようにする必要があります。

Tradefed におけるイベントのシーケンスは次のとおりです。

  1. デバイスが deviceConnected として認識され、adb からの通常のイベントを受け付けるようになります。
  2. 内部 Tradefed イベントが作成され、次のことを確認します。

    • デバイスがすでに認識されているかどうか。Tradefed は、一部のデバイス(特に、現在割り当てられているテスト対象のデバイス)に対して内部参照を維持します。これは、TF がデバイスのトラッキングを突然失ってしまうことを防ぐために行われます。
    • デバイスが ONLINE または OFFLINE であるか。
  3. 次に、デバイスの状態に応じて以下を実行します。

    • OFFLINE の場合: デバイスが Tradefed に対して CONNECTED_OFFLINE 状態に切り替わります。デバイスはまだテストを実行できません。その後、デバイスがオンラインになった場合は ONLINE サイクルに進みます。deviceDisconnect イベントを受信した場合、デバイスはリストから削除されます。

    • ONLINE の場合(adb で表示): デバイスが CONNECTED_ONLINE の状態となり、テスト割り当てに対してデバイスが使用可能であるかが確認されます(checking_availability)。

  4. availability のチェックが成功すると、デバイスはテスト割り当てに対して使用可能な状態であるとマークされ、テストを実行できるようになります。チェックに失敗した場合、デバイスはテスト割り当てに対して unavailable としてマークされ、テストを受信できません。

tf> list devices でデバイスをリストする場合、上記のすべての状態が Tradefed コンソールに反映されます。

デバイスがテストに割り当てられている場合、上記のほとんどの状態は発生せず、Tradefed はデバイスの状態を内部で判別する点に注意してください。つまり、Tradefed によってデバイスがリストされている状態でも、そのデバイスが adb devices で表示されなくなることがあります。この状況は、テストによってデバイスが再起動された場合などに発生します。

仮想デバイスが adb connect で接続されている場合

リモート仮想デバイスが作成されると、Tradefed は adb connect を使ってそのデバイスに接続します。これにより、通常はデバイスがトリガーされて <some ip>:<port number> 内に adb devices として表示されるようになります。そして、物理的に接続されたデバイスと同じシーケンスが適用されます。

deviceConnected のイベントが発生した場合のデバイス トラッキング

deviceConnected が発生した場合、ddmlib が新しいリファレンスである IDevice を作成して、新しく接続されたデバイスをトラッキングします。

Tradefed はこのリファレンスを使用して、デバイス インターフェース ITestDevice の独自の実装にラップし、より高度なサービスを提供します。ただし、基盤となる IDevice は常に ddmlib で作成されます。

つまり、新しいデバイスが接続されると新しい ITestDevice が作成され、IDevice に関連付けられます。これが呼び出し中に行われ、ITestDevice が使用されている場合でも、基盤となる IDevice は置き換えられ、正しいリファレンスでテストを続行できます。これは、デバイスが接続解除または再接続されるたび(再起動など)にシームレスに実行されます。