ADB“장치를 기다리는 중”문제 해결


9

우리는 Android 개발을위한 지속적인 통합 서버를 설정하고 있으며 ADB가 장치 문제를 기다리고 있습니다.

기록을 위해, 우리는 이미 조합을 많이 시도했습니다 adb kill-server, adb start-server, adb devices아무 소용 등.

슬프게도, 인터넷에서 찾은 것은 "장치의 플러그를 뽑았다가 다시 꽂는 것"의 변형입니다. 이는 분명히 우리에게는 해결책이 아닙니다. 각 빌드).

약간의 배경 지식으로, iOS 용 CI도 실행하기 때문에 Mac에서 Jenkins를 사용합니다.

문제에 접근하는 동안 OS 수준에서 장치를 찾으면 적어도 시작이라고 생각했습니다. 실제로, 명령을 system_profiler SPUSBDataType성공적으로 실행하면 ADB가 올바르게 작동 할 때보고하는 일련 번호를 포함하여 장치를 찾습니다.

나는 모든 USB 활동을 "새로 고침"하기 위해 약간의 절름발이 명령을 시도했지만 아무데도 가지 않았습니다. 그것은 당신이 장치를 마운트 / 마운트 해제 할 수있는 것이 아니라 정직하게 말해서 문제가 어디에 있는지 확실하지 않습니다. 저는 저레벨 USB 프로토콜에 대해 충분히 알지 못합니다 .Mac은 물론입니다. 내의 숨어 ADB의 소스 코드를하는 것은 매우, 매우 긴 촬영했다.

따라서이 시점에서 CI 서버에서 Android를 일관되게 실행할 수있는 솔루션을 제공합니다. Jenkins 작업 전에 ADB 또는 다른 검은 마술을 패치하기 전에 몇 가지 명령을 사용하십시오.

답변:


9

그것을 해결하는 방법을 찾았으므로 완전성을 위해 여기에 게시하십시오. 이것이 이것이 최선 의 해결 방법 이라고 말하지는 않지만 우리에게 도움이되었습니다.

따라서 오랜 시간 동안 CI를 사용하지 않으면 (시간 범위 내에서) 문제가 발생했습니다. 그래서 우리는 adb devices10 초마다 호출하는 간단한 스크립트를 만들었습니다 . 그리고 더 이상 "장치를 기다리는"문제가 없어졌습니다.

Linux에서는 간단한 cron작업으로 OSX 에서이 작업을 수행 할 수 launchctl있으며 Windows에 해당하는 것이 확실합니다.

그럼에도 불구하고 10 초마다 장치를 "핑 (ping)"하면 문제가 해결되었습니다.


1
감사! 내가 같은 문제를 겪고있는 것 같습니다. USB 케이블을 분리했다가 다시 연결하면 장치가 목록에 표시됩니다.
Jorge Pedret 2016

5

전화에서 USB 디버깅 (설정 => 개발자 옵션)을 활성화하는 것이 도움이되었습니다.


1

OSX 시스템의 iOS 장치 (iOS 및 Android에도 모두 사용)를 사용하는 Continuous Integration 환경과 비슷한 문제가있었습니다.

문제는 Jenkins가 adb 서버를 시작하도록 허용한다는 것입니다. Jenkins 작업이 들어오고 나가는 쉘과 연관되어 있기 때문에 문제가 발생합니다. Jenkins가 "adb devices"호출 (예를 들어)로 adb 데몬을 시작하면 수명이 짧은 Jenkins 셸이 adb 데몬을 소유하게되며 해당 셸이 실행을 마치고 닫으면 adb 데몬이 정리됩니다. 다른 adb 호출에 의해 자동으로 백업 될 때까지 이로 인해 adb 데몬을 시작 및 중지하는주기가 발생하지만 원하는 것은 무기한으로 유지하는 것입니다.

이 문제를 해결하는 한 가지 방법은 CI 시스템에 열려있는 셸에서 "adb 장치"를 실행하는 것입니다. 실행 후이 메시지가 표시되는지 여부에 따라 상위 프로세스인지 알 수 있습니다.

blah$ adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
xxxxxxxxxxx          device

이것은 컴퓨터를 다시 시작할 때마다 수행 해야하는 성가신 단계이며 누군가가 해당 명령 창을 닫으면 이전 문제로 돌아갑니다.

이론적으로 더 나은 방법은 .plist 파일을 만들어 부팅시 adb 데몬을 트리거하는 것입니다. 예는 다음과 같습니다. ~ / Library / LaunchAgents / server.adb.plist. 이것은 기본적으로 Jenkins가 소유하지 않도록 사용자 시작 데몬에서 adb start-server를 실행합니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>server.adb</string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <false/>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/Shared/Jenkins/android-sdk/platform-tools/adb</string>
        <string>start-server</string>
    </array>
  </dict>
</plist>

그러나이 문제는 adb 만 시작하지만 차단되지 않으므로 KeepAlive 실행 제어 기능을 사용할 수 없다는 것입니다. 또한 원하는 목적으로 작동하지 않는 것 같습니다. 누구든지 "데몬"모드에서 adb를 실행하는 방법을 알고 있어도 반환되지 않으면이 launchctl 메커니즘이 종료되면 자동으로 다시 시작하도록 설정하여 Jenkins가 소유권을 얻지 못하게 할 수 있습니다. 글쎄, 지금은 셸 창에서 "adb 장치"를 실행하고 열어 두겠습니다.


1

각 테스트 실행 전에 프로그래밍 가능한 전원 스트립을 사용하여 USB 허브를 재부팅하여이 문제를 해결했습니다. 이것은 USB 케이블을 뽑았다가 다시 꽂는 것과 같습니다.


당신은 더 expalin 할 수 있습니까?
Dinesh

1

나는 juan-delgado 의 훌륭한 제안을 따르고 싶었습니다 . MacOS High Sierra adb에서 watch명령으로 10 초마다 실행 하는 것도 빠른 해결 방법으로 효과적이라는 것을 알았습니다 .

watch -n 10 adb -d devices

이를 통해 .plist파일 작성을 회피 할 수 있지만 확실한 해결책은 영구적 인 해결책이 아니라는 것입니다. watch그것뿐만 아니라이 효과적 일한다, 그래서 명령은 OSX의 이전 버전에서 사용할 수 있습니다.


나는 watchmacOS Catalina를 가지고 있지 않았지만로 쉽게 설치할 수있었습니다 brew install watch.
mokagio

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.