Tradefed의 기기 감지

새 기기를 연결하면 명확하지는 않지만 이해할 만한 가치는 있는 일련의 비동기 이벤트가 트리거됩니다.

물리적 연결

Tradefed는 ddmlib 라이브러리(자바 adb 라이브러리)를 사용하여 adb와 기기의 기본적인 상호작용을 제공합니다. 이 솔루션의 일부는 다음과 같은 새로운 기기 이벤트를 수신할 수 있게 해주는 IDeviceChangeListener 인터페이스입니다.

  • deviceConnected: adb가 새 기기를 보는 경우
  • deviceDisconnected: 기기가 더 이상 adb에 보고하지 않는 경우
  • deviceChanged: 주요 기기 상태가 발생하는 경우(기기 오프라인 또는 기기 온라인)

이러한 이벤트는 adb 수준에서 충분히 기기의 연결, 온라인 또는 오프라인 여부를 결정할 수 있습니다. 하지만 테스트 하네스의 경우 기기가 제대로 테스트 실행을 시작할 준비를 마쳤는지 확인하기 위한 더 강력한 상태가 필요합니다. 새로 연결된 기기에서 비롯될 수 있는 잠재적인 상태 결함의 영향을 받으면 안 됩니다.

다음은 Tradefed의 이벤트 순서입니다.

  1. 기기가 deviceConnected로 인식되고 adb의 일반 이벤트에 열립니다.
  2. 내부 Tradefed 이벤트가 생성되어 다음을 실행합니다.

    • 이미 알려진 기기인지 확인합니다. Tradefed는 일부 기기(특히 최근에 할당되어 테스트를 실행 중인 기기)의 내부 참조를 유지하여 TF에서 기기 추적을 무작위로 잃지 않도록 합니다.
    • 기기가 ONLINE 또는 OFFLINE인지 확인합니다.
  3. 기기가 다음과 같은 상태인 경우:

    • OFFLINE: 기기가 Tradefed CONNECTED_OFFLINE 상태로 전환됩니다. 이 상태에서는 아직 기기에서 테스트를 실행할 수 없습니다. 기기가 나중에 온라인으로 전환되면 ONLINE 주기를 거치게 됩니다. Google이 deviceDisconnect 이벤트를 수신하면 기기가 목록에서 제거됩니다.

    • ONLINE(adb 관점): 기기가 CONNECTED_ONLINE 상태에 놓이며 테스트 할당(checking_availability)에 관한 가용성을 확인받습니다.

  4. availability 검사에 성공하면 기기가 테스트 할당에 사용 가능으로 표시되고 테스트를 실행할 수 있게 됩니다. 실패하면 기기가 할당을 위해 unavailable로 표시되며 어떠한 테스트도 수신할 수 없습니다.

이러한 모든 상태는 tf> list devices를 통해 기기를 나열할 때 Tradefed 콘솔에 반영됩니다.

기기가 현재 테스트를 위해 할당된 경우에는 위에서 설명한 대부분의 상태가 발생하지 않으며 Tradefed에서 기기 상태를 내부적으로 결정한다는 점에 주목해야 합니다. 따라서 Tradefed에 의해 계속해서 나열되고 있는 도중에는 기기가 adb devices에서 사라질 수도 있습니다. 예를 들어 기기가 테스트에 의해 재부팅되는 경우에 이러한 상황이 발생할 수 있습니다.

adb connect로 연결된 가상 기기

원격 가상 기기가 생성되면 Tradefed는 adb connect를 사용하여 기기를 연결합니다. 이는 보통 adb devices에 표시된 기기를 <some ip>:<port number>로 트리거하며 물리적으로 연결된 기기와 같은 순서를 따릅니다.

deviceConnected 이벤트 발생 시의 기기 추적

deviceConnected가 발생하면 ddmlib는 새로운 참조인 IDevice를 생성하여 새로 연결된 기기를 추적합니다.

Tradefed는 이 참조를 사용하고 기기 인터페이스 ITestDevice의 자체 구현으로 이를 래핑하여 고급 서비스를 제공합니다. 하지만 기본적인 IDevice는 항상 ddmlib에서 비롯됩니다.

즉 새 기기가 연결되면 새로운 ITestDevice 기기가 생성되어 IDevice와 연결됩니다. 호출 도중에 이러한 상황이 발생하고 ITestDevice가 사용되고 있으면, 테스트가 제대로 된 참조로 넘어갈 수 있도록 기본 IDevice가 교체됩니다. 이 과정은 기기가 연결 해제/재연결(예: 재부팅 도중)될 때마다 원활하게 이루어집니다.