Android 에뮬레이터를 사용한 원격 디버깅


94

한 컴퓨터에서 코드를 작성하고 Android 애플리케이션을 컴파일하고 다른 컴퓨터에서 시작한 에뮬레이터에서 원격으로 디버깅 할 수 있습니까? 랩톱 CPU의 절반을 지속적으로 먹는 에뮬레이터에 지쳐 있습니다.

답변:


72

adb connectcmb가 언급 한 명령을 이전에 시도해 본 적이 없거나 알아 차리지 못했지만 SSH를 통해 TCP 포트를 직접 전달하는 것이 제대로 작동하는지 확인할 수 있습니다.

에뮬레이터는 인스턴스 당 2 개의 TCP 포트 (텔넷 인터페이스 용 5554 및 DDMS와 같은 도구와의 제어 통신용 5555)에서 수신 대기합니다. 따라서 포워딩 포트 5555로만 벗어날 수 있습니다 (지금까지 두 가지 모두에 대해서만 시도했지만). 각 후속 에뮬레이터는 다음으로 사용 가능한 짝수 + 홀수 포트 번호 튜플을 사용합니다 (약 5580까지).

참고로 로컬 컴퓨터에서 다음 단계를 수행했습니다.

  • ssh -NL 5554:localhost:5554 -L 5555:localhost:5555 myuser@remote-server
  • killall adb; adb devices

에뮬레이터가 시작시 로컬 adb 서버에 알리려고한다고 생각합니다. 따라서 로컬 5554+ 포트를 검색하려면 adb를 다시 시작해야합니다.

점을 유의 localhostssh 명령에서이의 로컬 인터페이스를 지칭 원격 시스템.

adb devices새로운 에뮬레이터를 보여주었습니다. – emulator-5554– 마치 내 로컬 컴퓨터에서 실행되는 것처럼 사용할 수있었습니다.


1
Putty SSH 포트 포워딩을 사용하는 Windows 7 시스템에서도 매력적으로 작동합니다. 감사합니다.
gsbabil 2012-06-20

1
@JimMcKeeth : 위의 네트워크 구성에 따라 Putty를 열고 연결> SSH> 터널로 이동합니다. 이제 Source-port : 5556 및 Destination : localhost : 5554가있는 항목을 추가합니다. Source-port : 5557 및 Destination : localhost : 5555에 대해서도 동일하게 반복합니다. 건배!
gsbabil 2013

5
killall adb에뮬레이터는 다중 연결을 허용하지 않고 offline로컬 컴퓨터 용 이므로 서버에서도 필요 합니다.
Henrique de Sousa

누구든지 영어로 설명 할 수 있습니까?
Anil GR

21

다음은 Windows에서 해결 한 방법입니다. 나는 크리스토퍼의 리드를 거의 따랐지만 편집 할 수 없기 때문에 새로운 답변이 필요합니다.

내가 가진 문제는 ADB와 에뮬레이터가 0.0.0.0이 아닌 127.0.0.1에서 듣고 있다는 것입니다. 그렇지 않으면 TCPMon 을 사용했을 것 입니다. Windows에서 다르거 나 최신 버전의 SDK에서 변경된 것 같습니다. (으로 확인할 수 있습니다 netstat -ban.)

  1. 에뮬레이터를 실행하는 컴퓨터에 WinSSHD 를 설치했습니다 . (freeSSHd에서도 작동해야한다고 생각하지만 거기에서 작동하는 로그인을 얻을 수 없습니다.)

  2. Windows 방화벽에서 포트 22 (TCP)를 열었습니다. (WinSSHD가이를 수행 할 수 있습니다.)

  3. WinSSHD GUI에서 가상 계정을 만들었습니다.

  4. 개발 머신에서 에뮬레이터 머신으로 새로운 PuTTY 연결을 만들고 연결할 수 있는지 확인했습니다.

  5. 그런 다음 PuTTY에서 터널링을 설정했습니다. 연결-> SSH-> 터널

    Source port: 5554
    Destination: localhost:5554
    Type: Local/Auto

    Source port: 5555
    Destination: localhost:5555
    Type: Local/Auto

    (터널을 유지하려면 PuTTY를 연결하고 열어 두십시오.)

  6. 이제 원격 컴퓨터에서 에뮬레이터를 실행하고 ADB가 실행되고 있지 않은지 확인했습니다.

  7. 개발 머신에서 ADB를 다시 시작했습니다 ( adb kill-server, adb start-server).

  8. adb devices원격 에뮬레이터는 emulator-5554 device. 이제 Eclipse / ADT에서 직접 앱을 배포하고 실행할 수 있습니다. 여기에서 에뮬레이터는 마치 로컬 에뮬레이터 인 것처럼 가상 장치 아래에 표시되었습니다.


잘 했어! 세부 사항에 감사드립니다.
Jim McKeeth

1
좋습니다.하지만 명확히하고 싶습니다. 4 단계 후에 퍼티를 닫은 다음 5 단계에서 퍼티를 다시 열고 터널을 구성하고 다시 연결해야합니다. 6-8 단계 : 먼저 에뮬레이터를 시작한 다음 adb를 시작합니다 (호스트 머신에서). 9 단계 : 클라이언트 머신에서 adb를 다시 시작하고 adb devices를 입력하여 정상인지 확인합니다. 일반 DDMS 및 일식도 작동합니다.
Mister Smith

@MisterSmith 매우 유효한 포인트, 왜 편집을 제출하지 않습니까? :)
Henrik Heimbuerger 2014

@MisterSmith 문제의 성공에 매우 중요한이 의견을 반영하도록 답변을 편집 해 주시겠습니까? 또한 감사합니다. 이제 게스트 컴퓨터에서 호스트에 연결할 수 있습니다.
meanbunny

20

이 질문이 정말 오래되었다는 것을 알고 있지만 문제를 약간 다르게 해결했고이 사소한 해결책을 찾는 데 시간이 걸렸습니다.

나는 GUI를 좋아하기 때문에 일반적으로 Windows7 PC 또는 랩톱 (작업중인 위치에 따라 다름)을 프런트 엔드로 사용하지만 모든 편집 / 컴파일 / 디버그를 헤드리스 Ubuntu 서버에서 수행하는 것을 선호합니다. 제공하는 명령 줄 기능. 내 목표는 추가 서비스 (예 : sshd) 나 방화벽 허점없이 각 Windows 시스템을 가능한 한 씬 클라이언트로 만드는 것입니다.

그래서 여기에 시나리오가 있습니다.

  • System-A : Android 에뮬레이터가 실행중인 Windows7 시스템
  • System-B : SDK가 설치된 Ubuntu 서버

앞에서 설명한 문제는 System-A의 에뮬레이터가 외부 이더넷 인터페이스가 아닌 localhost에 바인딩되므로 System-B의 adb가 System-A의 에뮬레이터에 액세스 할 수 없다는 것입니다. 시스템 -B에 대한 SSH 연결을 위해 PuTTY에서 원격 포트 전달을 설정하기 만하면됩니다. 트릭은 두 개의 터널을 만들 때 "원격"라디오 버튼을 확인하여 터널 방향이 반대로되도록하는 것입니다 (로그인하는 서버에서 로그인 한 클라이언트로 터널링).

터널 스크린 샷

마지막으로 SSH 연결을 설정 한 후 System-B의 "localhost"에 adb를 사용하여 연결합니다.

System-B$ adb connect localhost
connected to localhost:5555
System-B$ adb devices
List of devices attached
localhost:5555  device

이제 정상적으로 이미지 / 디버그를 다운로드 할 수 있으며 노트북을 꺼내서 커피를 마시고 싶다면 다른 Windows 시스템으로 전환하는 것은 사소한 문제입니다.

또한 동일한 방식으로 포트 5037을 터널링하여 실제로 adb 서버 연결을 전달하여 System-A의 USB를 통해 실제 Android 기기를 연결하고 System-B에서 이미지를 다운로드 할 수 있습니다. 이 작업을 수행하려면 SSH 세션을 시작하기 전에 adb 서버가 System-A에서 실행되고 있고 System-B에서는 실행되지 않는지 확인해야합니다.

먼저 System-A (명령 프롬프트)에서 adb 서버를 시작합니다.

C:\> adb start-server
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
C:\> adb devices
List of devices attached
3435F6E6035B00EC        device

다음으로 System-B에서 adb 서버를 종료합니다.

System-B$ adb kill-server

마지막으로 System-B에 대한 ssh 세션을 다시 시작하고

System-B$ adb devices
List of devices attached
3435F6E6035B00EC        device

System-A에 android sdk를 설치하지 않고이를 수행 할 수있는 방법이 있습니까? (Windows 시스템?)
키스 Twombley

아니요, 장치와 통신하려면 adb 서버 및 USB 드라이버가 System-A에서 실행되어야하기 때문입니다.
Patrick McKinnon 2011

Windows 7 (에뮬레이터 실행)-> Linux (네트워크로 인해 필요한 홉 ...)-> Eclipse를 실행하는 OS X와 ​​같은 설정으로도이 작업을 수행했습니다. 'adb 장치'가있는 장치를 볼 수 있고 Eclipse의 에뮬레이터를 사용할 수 있습니다. 문제는 에뮬레이터의 Android 대상을 인식하지 못하기 때문에 수동으로 실행할 때마다 대상을 선택해야한다는 것입니다.
프랭크

Mac OS X 용 퍼티가 필요한 경우 여기에서 찾을 수 있습니다. mac-tools.org/putty-fur-mac-os-x/02/2012 저에게는 해당 도구와 함께 작동했습니다.
브루노 Bieri

@PatrickMcKinnon은 잘 작동했지만 System-B에서는 "adb 장치"를 호출 할 때 권한이 부여되지 않습니다. 시스템 B에서 "adb 장치"는 제대로 작동하는 것으로 표시합니다. 도움이 필요하세요?
Tejas Sherdiwala

6

두 컴퓨터가 동일한 사설 네트워크에 있으므로 SSH 암호화 (일반적인 경우)를 사용할 필요가없는 경우 쉽게 수행 할 수있는 방법을 찾았습니다. SSH 터널은 매우 길고 설치하기 어려울 수 있으므로 도움이 될 수 있습니다. 예를 들어 처음으로 Cygwin / Windows에서 SSH 데몬을 설치하면 포기할 수 있습니다 (글쎄요, 포기했습니다).

Windows에서 다음을 수행하려면 httptunnel 패키지와 함께 Cygwin을 설치해야합니다 . 이것은 Linux / httptunnel 에서도 작동해야 하지만 시도하지 않았습니다.

  • 머신 중 하나에서 에뮬레이터를 실행합니다 (호스트 이름이 HostEmulator 라고 가정 해 보겠습니다 ).

  • 다른 컴퓨터에서 Eclipse를 시작합니다 ( HostEclipse 라고 합시다 ).

  • 각 컴퓨터에서 Cygwin 터미널을 연 다음,

  • HostEmulator , 다음 Cygwin에서 명령을 입력 :

    hts -F localhost:5554 10000
    hts -F localhost:5555 10001
    

htsHttp Tunnel Server를 의미 합니다.

이 두 명령은 포트 10001 및 10001을 수신하는 2 개의 하프 브리지를 생성하고 이러한 포트의 I / O를 에뮬레이터에서 사용하는 포트 인 로컬 포트 ​​5554 및 5555로 리디렉션합니다 (실제로는 첫 번째 로칭 에뮬레이터- 당신이 그들 중 몇몇을 실행하고 있다면 그들은이 페이지의 다른 응답에서 볼 수 있듯이 더 높은 포트 번호를 사용합니다).

  • HostEclipse , 이러한 것들을 입력 :

    htc -F 5554 HostEmulator:10000
    htc -F 5555 HostEmulator:10001
    

htcHttp Tunnel Client를 의미 합니다 .

이러한 명령은 누락 된 하프 브리지를 만듭니다. 그들은 로컬 포트 ​​5554 및 5555를 듣고 이러한 포트의 I / O를 이전 에 HostEmulator에서 생성 한 하프 브리지로 리디렉션합니다 .

  • 그런 다음 HostEclipse 에서 다음 세 명령을 입력하십시오 .

    adb kill-server
    adb start-server
    adb devices
    

그렇지 않으면 원격 에뮬레이터를 감지하지 못하므로 adb를 다시 시작합니다. 시작할 때 스캔을해야합니다. 그리고 확인을 위해 장치 (사용 가능한 에뮬레이터)를 나열합니다.

  • 그리고 당신은 간다.

마치 로컬 인 것처럼 원격 에뮬레이터로 작업 할 수 있습니다. 두 시스템에서 Cygwin 터미널을 열어 두어야합니다. 그렇지 않으면 생성 한 하프 브리지를 죽일 것입니다.

여기서는 기계 / 기계 교환을 위해 포트 10000과 10001을 사용했지만, 물론 아직 사용하지 않는 한 다른 포트를 사용할 수 있습니다.


2

내 ssh 서비스가 시작되지 않을 때 Windows + AndroVM (호스트 전용 어댑터가 필요함)에 대한 내 솔루션. 따라서 추가 소프트웨어가 필요하지 않습니다.

adb connect <Andro VM IP>
adp tcpip 555

cmd 프롬프트에서 관리자로 실행하십시오.

netsh interface portproxy add v4tov4 listenport=5555 listenaddress=<host ip> connectport=5555 connectaddress=<Andro VM IP>

Windows 방화벽에서 TCP 포트 5555를 엽니 다.

그런 다음 두 번째 PC에서 다음을 실행합니다.

adb connect <host ip>

1

제안 된 솔루션 중 어느 것도 나를 위해 일하지 않았습니다. Emirikol의 솔루션에서 시작하여 새로운 Android API> 21에서 에뮬레이터가 오프라인으로 나타나고 Genymotion 설정으로 이동하여 Android SDK 경로를 비워 두어야했기 때문에이를 개선했습니다. 그리고 명령 줄에서 :

netsh interface portproxy add v4tov4 listenport=5555 connectport=5555 connectaddress=<emulatorIP>

netsh interface portproxy add v4tov4 listenport=5554 connectport=5554 connectaddress=<emulatorIP>

출처 : http://www.sarpex.co.uk/index.php/2016/10/02/connect-genymotion-emulator-remotely/ 면책 조항, 저는 저자입니다.


완벽한 답변과 기사! Genymotion을 사용하는 경우이 솔루션을 사용하십시오. 이 기사는 Windows 및 Mac에 대해 작성되었지만 로컬 Ubuntu 및 원격 Ubuntu가 있으며 모두 정상적으로 작동합니다. 내 주를 구했습니다!
konstantin_doncov

1

adb를 실행할 때 아직 실행 중이 아닌 경우 자체 서버 사본을 시작합니다. 장치가있는 머신에서 직접 복사를 시작할 수 있으며 sdk 4.3 이후 서버에 원격 머신을 수신하도록 지시하는 -a 옵션을 제공 할 수 있습니다. 종료되지 않는 다음 명령으로 수행하십시오.

adb -a -P 5037 서버 노 데몬

장치를 사용하려는 머신에서 환경 변수의 ADB_SERVER_SOCKET을 tcp : xxxx : 5037로 설정합니다 (또는 -L 옵션을 사용하여 각 adb 호출에 동일한 값을 제공). 여기서 xxxx는 해당 장치의 IP 주소 또는 호스트 이름입니다. 장치가있는 머신이고 5037은 위의 명령에서 지정한 포트와 일치합니다.

이를 사용하여 3 대의 컴퓨터에 분산 된 약 100 개의 에뮬레이터에 대한 액세스 권한을 엔드 투 엔드 테스트를 병렬로 실행하는 컴퓨터와 원격으로 실제 장치를 공유하려는 개발자에게 제공합니다.

adb forward 및 adb reverse를 사용하여 에뮬레이터간에 포트를 전달할 수 있으며, 'adb forward'를 실행중인 머신이 아닌 기기가있는 머신에 표시됩니다.


이 솔루션에 대한 자세한 내용을 제공 할 수 있습니까? 말씀하신 모든 것을 수행했지만 Android Studio의 "Select Deployment Target"에 장치가 없습니다. 두 번째 컴퓨터에서 Genymotion을 사용합니다.
konstantin_doncov

@ don-prog 명령 줄에서 작동하는지 여부는 말하지 않습니다. 작동하는 adb -L tcp:remotehost:1234 devices경우 Android Studio가 원격 ADB를 지원하는지 여부를 알아 내야합니다. 로컬 장치.
android.weasel

0

SDK가있는 두 번째 머신은 없지만 에뮬레이터의 수신 포트 (기본값 5554, 5555)가에서 수신 대기하고 있습니다 0.0.0.0. 즉, 원격 시스템에서 연결할 수 adb --help있으며 connect <host>:<port>명령 을 보여줍니다 . 명령이 작동 adb devices하도록 표시 될 것이라고 가정 adb합니다. Eclipse의 경우 "구성 실행 / 실행 ..."을 시도하고 대상을 수동으로 설정하십시오. 그러면 adb가 연결되면 원격 에뮬레이터가 포함될 것으로 예상되는 "장치 선택기"가 제공됩니다. 시도할만한 가치가 있습니다.

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