2025년 3월 27일부터 AOSP를 빌드하고 기여하려면 aosp-main
대신 android-latest-release
를 사용하는 것이 좋습니다. 자세한 내용은 AOSP 변경사항을 참고하세요.
Tradefed의 기기 감지
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
새 기기를 연결하면 명확하지는 않지만 이해할 만한 가치는 있는 일련의 비동기 이벤트가 트리거됩니다.
물리적 연결
Tradefed는 ddmlib
라이브러리(자바 adb
라이브러리)를 사용하여 adb
와 기기의 기본적인 상호작용을 제공합니다. 이 솔루션의 일부는 다음과 같은 새로운 기기 이벤트를 수신할 수 있게 해주는 IDeviceChangeListener 인터페이스입니다.
deviceConnected
: adb
가 새 기기를 보는 경우
deviceDisconnected
: 기기가 더 이상 adb
에 보고하지 않는 경우
deviceChanged
: 주요 기기 상태가 발생하는 경우(기기 오프라인 또는 기기 온라인)
이러한 이벤트는 adb
수준에서 충분히 기기의 연결, 온라인 또는 오프라인 여부를 결정할 수 있습니다. 하지만 테스트 하네스의 경우 기기가 제대로 테스트 실행을 시작할 준비를 마쳤는지 확인하기 위한 더 강력한 상태가 필요합니다. 새로 연결된 기기에서 비롯될 수 있는 잠재적인 상태 결함의 영향을 받으면 안 됩니다.
다음은 Tradefed의 이벤트 순서입니다.
- 기기가
deviceConnected
로 인식되고 adb
의 일반 이벤트에 열립니다.
내부 Tradefed 이벤트가 생성되어 다음을 실행합니다.
- 이미 알려진 기기인지 확인합니다. Tradefed는 일부 기기(특히 최근에 할당되어 테스트를 실행 중인 기기)의 내부 참조를 유지하여 TF에서 기기 추적을 무작위로 잃지 않도록 합니다.
- 기기가
ONLINE
또는 OFFLINE
인지 확인합니다.
기기가 다음과 같은 상태인 경우:
OFFLINE
: 기기가 Tradefed CONNECTED_OFFLINE
상태로 전환됩니다. 이 상태에서는 아직 기기에서 테스트를 실행할 수 없습니다. 기기가 나중에 온라인으로 전환되면 ONLINE
주기를 거치게 됩니다. Google이 deviceDisconnect
이벤트를 수신하면 기기가 목록에서 제거됩니다.
ONLINE
(adb 관점): 기기가 CONNECTED_ONLINE
상태에 놓이며 테스트 할당(checking_availability
)에 관한 가용성을 확인받습니다.
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가 교체됩니다. 이 과정은 기기가 연결 해제/재연결(예: 재부팅 도중)될 때마다 원활하게 이루어집니다.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-07-27(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-07-27(UTC)"],[],[],null,["# Device detection in Tradefed\n\nA new device connection triggers a series of asynchronous events that are not\nobvious yet worth understanding.\n\nPhysically connected\n--------------------\n\nTradefed uses the `ddmlib` library (a Java `adb` library) to provide the basic\ninteraction with `adb` and devices. Part of this solution is the\n[IDeviceChangeListener interface](https://android.googlesource.com/platform/tools/base/+/refs/heads/android16-release/ddmlib/src/main/java/com/android/ddmlib/AndroidDebugBridge.java)\nthat allows reception of new device events, such as:\n\n- `deviceConnected`: When a new device is seen by `adb`\n- `deviceDisconnected`: When a device is not reporting to `adb` anymore\n- `deviceChanged`: When a major device state occurs (such as device offline or device online)\n\nThese events are enough at the `adb` level to decide whether or not a device is\nconnected, online, or offline. But for the test harness, we need a stronger\nstate than this to ensure a device is truly ready to start running tests; it\nshould not be impacted by potential state flakiness that can come with a newly\nconnected device.\n\nThis is the sequence of events in Tradefed:\n\n1. Device is recognized as `deviceConnected` and open to regular events from `adb`\n2. An internal Tradefed event is created that will:\n\n - Check if the device is known already; Tradefed keeps internal reference to some devices (especially the one current allocated and running tests) to avoid TF losing track of them randomly.\n - Check if the device is `ONLINE` or `OFFLINE`.\n3. If device is:\n\n - `OFFLINE`: Device will be switched to Tradefed `CONNECTED_OFFLINE`\n state, which doesn't allow the device to run tests yet. If the device is\n online later, it will go through the `ONLINE` cycle. If we receive a\n `deviceDisconnect` event, the device will simply be removed from the list.\n\n - `ONLINE` (as seen by adb): Device will be put in the state\n `CONNECTED_ONLINE` and will have its availability checked for test\n allocation: `checking_availability`.\n\n4. If `availability` check is successful, the device will be marked as\n available for test allocation; it will be able to run tests. If not, the\n device will be marked as `unavailable` for allocation and cannot receive any\n tests.\n\nAll of these states are reflected in the Tradefed console when listing the\ndevices via: `tf\u003e list devices`\n\nIt's important to note that when the device is currently allocated for a test,\nmost of the above will not occur and Tradefed will determine the device state\ninternally. So it's possible for a device to disappear from `adb devices` while\nstill being listed by Tradefed. That can happen when a test is rebooting the\ndevice for example.\n\nVirtual device connected with adb connect\n-----------------------------------------\n\nWhen a remote virtual device is created, Tradefed connects to it using `adb\nconnect`. This will usually trigger the device showing in `adb devices` as\n`\u003csome ip\u003e:\u003cport number\u003e` and will follow the same sequence as physically\nconnected devices.\n\nDevice tracking when a deviceConnected event occurs\n---------------------------------------------------\n\nWhen `deviceConnected` occurs, `ddmlib` creates a new reference\n[IDevice](https://android.googlesource.com/platform/tools/base/+/refs/heads/android16-release/ddmlib/src/main/java/com/android/ddmlib/IDevice.java)\nto track the newly connected device.\n\nTradefed uses that reference and wraps it in its own implementation of device\ninterface\n[ITestDevice](https://android.googlesource.com/platform/tools/tradefederation/+/refs/heads/android16-release/device_build_interfaces/com/android/tradefed/device/ITestDevice.java)\nto provide more advanced service. But the underlying IDevice is always the one\ncoming from `ddmlib`.\n\nThis means if a new device is connected, a new ITestDevice is created and\nassociated with the IDevice. When this happens during an invocation and the\nITestDevice is being used, the underlying IDevice is still replaced so\ntesting can proceed on the proper reference. This is done seamlessly each time a\ndevice is disconnected/reconnected (for example, during a reboot)."]]