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

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



답변

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– 마치 내 로컬 컴퓨터에서 실행되는 것처럼 사용할 수있었습니다.


답변

다음은 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에서 직접 앱을 배포하고 실행할 수 있습니다. 여기에서 에뮬레이터는 마치 로컬 에뮬레이터 인 것처럼 가상 장치 아래에 표시되었습니다.


답변

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

나는 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


답변

두 컴퓨터가 동일한 사설 네트워크에 있으므로 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을 사용했지만, 물론 아직 사용하지 않는 한 다른 포트를 사용할 수 있습니다.


답변

내 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>


답변

제안 된 솔루션 중 어느 것도 나를 위해 일하지 않았습니다. 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/
면책 조항, 저는 저자입니다.


답변

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’를 실행중인 머신이 아닌 기기가있는 머신에 표시됩니다.