新しいデバイスを接続すると、一連の非同期的なイベントが起動します。これらのイベントは理解しづらいものの、理解しておくと役に立ちます。
物理的に接続した場合
Tradefed は、adb
およびデバイスとの基本的なインタラクションに ddmlib
ライブラリ(Java adb
ライブラリ)を使用します。このソリューションには、次のような新しいデバイス イベントの受信を可能にする IDeviceChangeListener インターフェースが使用されています。
deviceConnected
: 新しいデバイスがadb
によって検出されたときのイベントdeviceDisconnected
: デバイスがこれ以降adb
にレポートを送信しなくなるときのイベントdeviceChanged
: デバイスの状態に重要な変化が発生したときのイベント(デバイスのオフラインやオンラインなど)
デバイスが接続中、オンライン、またはオフラインであるかを adb
レベルで判断するためには、上記のイベントで十分です。しかし、テストハーネスでは、デバイスでテストを確実に実行できるようにするために、これよりもさらに強力な状態が必要です。つまり、新しく接続するデバイスで発生する可能性がある不安定な状態に影響を受けないようにする必要があります。
Tradefed におけるイベントのシーケンスは次のとおりです。
- デバイスが
deviceConnected
として認識され、adb
からの通常のイベントを受け付けるようになります。 内部 Tradefed イベントが作成され、次のことを確認します。
- デバイスがすでに認識されているかどうか。Tradefed は、一部のデバイス(特に、現在割り当てられているテスト対象のデバイス)に対して内部参照を維持します。これは、TF がデバイスのトラッキングを突然失ってしまうことを防ぐために行われます。
- デバイスが
ONLINE
またはOFFLINE
であるか。
次に、デバイスの状態に応じて以下を実行します。
OFFLINE
の場合: デバイスが Tradefed に対してCONNECTED_OFFLINE
状態に切り替わります。デバイスはまだテストを実行できません。その後、デバイスがオンラインになった場合はONLINE
サイクルに進みます。deviceDisconnect
イベントを受信した場合、デバイスはリストから削除されます。ONLINE
の場合(adb で表示): デバイスがCONNECTED_ONLINE
の状態となり、テスト割り当てに対してデバイスが使用可能であるかが確認されます(checking_availability
)。
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 は置き換えられ、正しいリファレンスでテストを続行できます。これは、デバイスが接続解除または再接続されるたび(再起動など)にシームレスに実行されます。