한 컴퓨터에서 코드를 작성하고 Android 애플리케이션을 컴파일하고 다른 컴퓨터에서 시작한 에뮬레이터에서 원격으로 디버깅 할 수 있습니까? 랩톱 CPU의 절반을 지속적으로 먹는 에뮬레이터에 지쳐 있습니다.
답변:
adb connect
cmb가 언급 한 명령을 이전에 시도해 본 적이 없거나 알아 차리지 못했지만 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를 다시 시작해야합니다.
점을 유의 localhost
ssh 명령에서이의 로컬 인터페이스를 지칭 원격 시스템.
adb devices
새로운 에뮬레이터를 보여주었습니다. – emulator-5554
– 마치 내 로컬 컴퓨터에서 실행되는 것처럼 사용할 수있었습니다.
killall adb
에뮬레이터는 다중 연결을 허용하지 않고 offline
로컬 컴퓨터 용 이므로 서버에서도 필요 합니다.
다음은 Windows에서 해결 한 방법입니다. 나는 크리스토퍼의 리드를 거의 따랐지만 편집 할 수 없기 때문에 새로운 답변이 필요합니다.
내가 가진 문제는 ADB와 에뮬레이터가 0.0.0.0이 아닌 127.0.0.1에서 듣고 있다는 것입니다. 그렇지 않으면 TCPMon 을 사용했을 것 입니다. Windows에서 다르거 나 최신 버전의 SDK에서 변경된 것 같습니다. (으로 확인할 수 있습니다 netstat -ban
.)
에뮬레이터를 실행하는 컴퓨터에 WinSSHD 를 설치했습니다 . (freeSSHd에서도 작동해야한다고 생각하지만 거기에서 작동하는 로그인을 얻을 수 없습니다.)
Windows 방화벽에서 포트 22 (TCP)를 열었습니다. (WinSSHD가이를 수행 할 수 있습니다.)
WinSSHD GUI에서 가상 계정을 만들었습니다.
개발 머신에서 에뮬레이터 머신으로 새로운 PuTTY 연결을 만들고 연결할 수 있는지 확인했습니다.
그런 다음 PuTTY에서 터널링을 설정했습니다. 연결-> SSH-> 터널
Source port: 5554
Destination: localhost:5554
Type: Local/Auto
Source port: 5555
Destination: localhost:5555
Type: Local/Auto
(터널을 유지하려면 PuTTY를 연결하고 열어 두십시오.)
이제 원격 컴퓨터에서 에뮬레이터를 실행하고 ADB가 실행되고 있지 않은지 확인했습니다.
개발 머신에서 ADB를 다시 시작했습니다 ( adb kill-server
, adb start-server
).
adb devices
원격 에뮬레이터는 emulator-5554 device
. 이제 Eclipse / ADT에서 직접 앱을 배포하고 실행할 수 있습니다. 여기에서 에뮬레이터는 마치 로컬 에뮬레이터 인 것처럼 가상 장치 아래에 표시되었습니다.
이 질문이 정말 오래되었다는 것을 알고 있지만 문제를 약간 다르게 해결했고이 사소한 해결책을 찾는 데 시간이 걸렸습니다.
나는 GUI를 좋아하기 때문에 일반적으로 Windows7 PC 또는 랩톱 (작업중인 위치에 따라 다름)을 프런트 엔드로 사용하지만 모든 편집 / 컴파일 / 디버그를 헤드리스 Ubuntu 서버에서 수행하는 것을 선호합니다. 제공하는 명령 줄 기능. 내 목표는 추가 서비스 (예 : sshd) 나 방화벽 허점없이 각 Windows 시스템을 가능한 한 씬 클라이언트로 만드는 것입니다.
그래서 여기에 시나리오가 있습니다.
앞에서 설명한 문제는 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
hts 는 Http Tunnel Server를 의미 합니다.
이 두 명령은 포트 10001 및 10001을 수신하는 2 개의 하프 브리지를 생성하고 이러한 포트의 I / O를 에뮬레이터에서 사용하는 포트 인 로컬 포트 5554 및 5555로 리디렉션합니다 (실제로는 첫 번째 로칭 에뮬레이터- 당신이 그들 중 몇몇을 실행하고 있다면 그들은이 페이지의 다른 응답에서 볼 수 있듯이 더 높은 포트 번호를 사용합니다).
에 HostEclipse , 이러한 것들을 입력 :
htc -F 5554 HostEmulator:10000
htc -F 5555 HostEmulator:10001
htc 는 Http 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'를 실행중인 머신이 아닌 기기가있는 머신에 표시됩니다.
adb -L tcp:remotehost:1234 devices
경우 Android Studio가 원격 ADB를 지원하는지 여부를 알아 내야합니다. 로컬 장치.
SDK가있는 두 번째 머신은 없지만 에뮬레이터의 수신 포트 (기본값 5554, 5555)가에서 수신 대기하고 있습니다 0.0.0.0
. 즉, 원격 시스템에서 연결할 수 adb --help
있으며 connect <host>:<port>
명령 을 보여줍니다 . 명령이 작동 adb devices
하도록 표시 될 것이라고 가정 adb
합니다. Eclipse의 경우 "구성 실행 / 실행 ..."을 시도하고 대상을 수동으로 설정하십시오. 그러면 adb가 연결되면 원격 에뮬레이터가 포함될 것으로 예상되는 "장치 선택기"가 제공됩니다. 시도할만한 가치가 있습니다.