Android Emulator 네트워킹 설정

에뮬레이터는 앱에 복잡한 모델링 및 테스트 환경을 설정하는 데 사용할 수 있는 다목적 네트워킹 기능을 제공합니다. 다음 섹션에서는 에뮬레이터 네트워크 아키텍처 및 기능을 소개합니다.

네트워크 주소 공간

에뮬레이터의 각 인스턴스는 가상 라우터/방화벽 서비스 뒤에서 실행되어 개발용 컴퓨터 네트워크 인터페이스 및 설정과 인터넷에서 격리됩니다. 에뮬레이션된 기기는 네트워크에서 개발용 컴퓨터나 다른 에뮬레이터 인스턴스를 볼 수 없습니다. 대신 이더넷을 통해 라우터/방화벽에 연결되어 있는 것만 봅니다.

각 인스턴스의 가상 라우터는 10.0.2/24 네트워크 주소 공간을 관리합니다. 라우터가 관리하는 주소는 모두 10.0.2.xx 형식이고 여기서 xx는 숫자입니다. 이 공간 내의 주소는 다음과 같이 에뮬레이터/라우터에 의해 미리 할당됩니다.

네트워크 주소 설명
10.0.2.1 라우터/게이트웨이 주소
10.0.2.2 호스트 루프백 인터페이스의 특수 별칭(개발용 컴퓨터의 127.0.0.1)
10.0.2.3 첫 번째 DNS 서버
10.0.2.4/10.0.2.5/10.0.2.6 두 번째, 세 번째, 네 번째 DNS 서버(선택사항, 있는 경우)
10.0.2.15 에뮬레이션된 기기 네트워크/이더넷 인터페이스
127.0.0.1 에뮬레이션된 기기 루프백 인터페이스

실행 중인 모든 에뮬레이터 인스턴스에서 같은 주소 할당이 사용됨에 주의하세요. 즉, 컴퓨터에서 인스턴스 두 개가 동시에 실행되는 경우 각각 자체 라우터가 있고 그 뒤에는 IP 주소 10.0.2.15가 있습니다. 인스턴스는 라우터에 의해 격리되며 같은 네트워크에서 서로 볼 수 없습니다. 에뮬레이터 인스턴스가 TCP/UDP를 통해 통신하도록 하는 방법에 관한 자세한 내용은 에뮬레이터 인스턴스 상호 연결하기를 참조하세요.

또한 개발용 컴퓨터의 주소 127.0.0.1은 에뮬레이터의 자체 루프백 인터페이스에 해당함에 주의하세요. 개발용 컴퓨터 루프백 인터페이스(컴퓨터의 127.0.0.1)에서 실행되는 서비스에 액세스하려면 특수 주소 10.0.2.2를 대신 사용해야 합니다.

마지막으로 에뮬레이션된 기기의 미리 할당된 주소는 Android Emulator에 따라 다르며 실제 기기(특히 라우터/방화벽 뒤에 NAT로 연결될 가능성도 매우 높음)에서는 매우 다를 수 있음에 주의하세요.

로컬 네트워킹 제한

에뮬레이터에서 실행되는 Android 앱은 워크스테이션에서 사용 가능한 네트워크에 연결될 수 있습니다. 그러나 앱은 하드웨어에 직접 연결되는 것이 아니라 에뮬레이터를 통해 연결되며 에뮬레이터는 워크스테이션에서 일반 앱처럼 작동합니다. 이로 인해 몇 가지 제한이 발생할 수 있습니다.

  • 에뮬레이션된 기기와의 통신이 컴퓨터에서 실행 중인 방화벽 프로그램에 의해 차단될 수 있습니다.
  • 에뮬레이션된 기기와의 통신이 컴퓨터가 연결된 다른 (물리적)방화벽/라우터에 의해 차단될 수 있습니다.

개발용 컴퓨터 네트워크 환경에서 허용하는 경우 에뮬레이터 가상 라우터는 에뮬레이션된 기기를 대신해 모든 아웃바운드 TCP 및 UDP 연결/메시지를 처리할 수 있어야 합니다. 호스트 운영체제 및 네트워크에 따라 적용되는 제한을 제외하고 포트 번호 또는 범위에 기본적으로 지정된 제한은 없습니다.

환경에 따라 에뮬레이터는 다른 프로토콜을 지원하지 못할 수도 있습니다(예: 'ping'에 사용되는 ICMP). 현재 에뮬레이터는 IGMP 또는 멀티캐스트를 지원하지 않습니다.

네트워크 리디렉션 사용하기

가상 라우터 뒤의 에뮬레이터 인스턴스와 통신하려면 가상 라우터에서 네트워크 리디렉션을 설정해야 합니다. 그러면 클라이언트가 라우터의 지정된 게스트 포트에 연결될 수 있고 라우터는 포트와의 트래픽을 에뮬레이션된 기기 호스트 포트로 보냅니다.

네트워크 리디렉션을 설정하려면 에뮬레이터 인스턴스에서 호스트 및 게스트 포트/주소의 매핑을 만듭니다. 네트워크 리디렉션을 설정하는 방법에는 두 가지가 있습니다. 에뮬레이터 콘솔 명령어 사용하기와 adb 도구 사용하기입니다(아래 설명 참조).

에뮬레이터 콘솔을 통한 리디렉션 설정

각 에뮬레이터 인스턴스에 제공되는 제어 콘솔에 연결하여 인스턴스에 특정한 명령어를 실행할 수 있습니다. redir 콘솔 명령어를 사용하여 에뮬레이터 인스턴스에 필요한 리디렉션을 설정할 수 있습니다.

먼저 타겟 에뮬레이터 인스턴스의 콘솔 포트 번호를 결정합니다. 예를 들어 첫 번째로 실행된 에뮬레이터 인스턴스의 콘솔 포트 번호는 5554입니다. 그런 다음 타겟 에뮬레이터 인스턴스의 콘솔에 연결하고 다음과 같이 콘솔 포트 번호를 지정합니다.

telnet localhost 5554

연결되면 redir 명령어를 사용하여 리디렉션 작업을 실행합니다. 리디렉션을 추가하려면 다음을 사용합니다.

add <protocol>:<host-port>:<guest-port>
    

여기서 <protocol>tcp 또는 udp이고 <host-port><guest-port>는 개발용 컴퓨터와 에뮬레이션된 시스템 사이의 매핑을 각각 설정합니다.

예를 들어 다음 명령어는 127.0.0.1:5000에서 호스트(개발용) 컴퓨터로 들어오는 모든 TCP 연결을 처리하고 10.0.2.15:6000의 에뮬레이션된 시스템으로 전달하는 리디렉션을 설정합니다.

redir add tcp:5000:6000

리디렉션을 삭제하려면 redir del 명령어를 사용하면 됩니다. 특정 인스턴스의 모든 리디렉션을 나열하려면 redir list를 사용할 수 있습니다. 이것과 기타 콘솔 명령어에 관한 자세한 내용은 에뮬레이터 콘솔 사용하기를 참조하세요.

포트 번호는 로컬 환경에 따라 제한되는 점에 주의하세요. 이는 일반적으로 특별한 관리자 권한이 없으면 1024 미만의 호스트 포트 번호를 사용할 수 없음을 의미합니다. 또한 컴퓨터의 다른 프로세스에서 이미 사용 중인 호스트 포트의 리디렉션을 설정할 수 없습니다. 이 경우 redir는 그 결과에 관한 오류 메시지를 생성합니다.

adb를 통한 리디렉션 설정

Android 디버그 브리지(adb) 도구는 네트워크 리디렉션을 설정하는 다른 방법인 포트 전달을 제공합니다. 자세한 내용은 adb 문서에서 포트 전달하기를 참조하세요.

adb에서는 현재 adb 서버를 종료해야만 리디렉션을 삭제할 수 있습니다.

에뮬레이터 DNS 설정 구성

시작할 때 에뮬레이터는 시스템에서 현재 사용중인 DNS 서버 목록을 읽습니다. 그런 다음 이 목록의 서버 최대 4개의 IP 주소를 저장하고 필요에 따라 에뮬레이션된 주소 10.0.2.3, 10.0.2.4, 10.0.2.5, 10.0.2.6에서 저장된 주소에 별칭을 설정합니다.

Linux 및 OS X에서 에뮬레이터는 /etc/resolv.conf 파일을 파싱하여 DNS 서버 주소를 얻습니다. Windows에서 에뮬레이터는 GetNetworkParams() API를 호출하여 주소를 얻습니다. 이것은 일반적으로 에뮬레이터가 '호스트' 파일(Linux/OS X에서 /etc/hosts, Windows에서 %WINDOWS%/system32/HOSTS)의 콘텐츠를 무시한다는 것을 의미합니다.

명령줄에서 에뮬레이터를 시작할 때 -dns-server <serverList> 옵션을 사용하여 사용할 DNS 서버 주소를 수동으로 지정할 수도 있습니다. 여기서 <serverList>는 쉼표로 구분된 서버 이름 또는 IP 주소 목록입니다. 에뮬레이션된 네트워크에서 DNS 해상도 문제가 발생하는 경우 이 옵션이 유용할 수 있습니다(예: 웹브라우저를 사용할 때 표시되는 '알 수 없는 호스트 오류' 메시지).

프록시로 에뮬레이터 사용하기

많은 회사 네트워크에서 특정 프록시를 통해 발생하는 경우를 제외하고는 인터넷에 직접 연결은 작동하지 않습니다(네트워크 관리자가 거부함). 웹브라우저 및 기타 회사 앱은 프록시를 사용하도록 미리 구성되어 있으므로 웹을 둘러볼 수 있습니다. 에뮬레이터와 같은 일반 앱의 경우 프록시가 있고 거기에 연결해야 한다는 것을 알아야 합니다.

HTTP의 특성으로 인해 웹 서버 직접 연결 및 프록시를 통한 연결은 다른 GET 요청을 초래합니다. 에뮬레이터는 프록시와 통신하기 전에 가상 기기의 GET 요청을 투명하게 다시 작성하여 작동합니다.

에뮬레이터가 프록시 서버를 통해 인터넷에 액세스해야 한다면 에뮬레이터의 Extended controls 화면에서 사용자설정 HTTP 프록시를 구성할 수 있습니다. 에뮬레이터가 열린 상태에서 More 를 클릭한 다음 SettingsProxy를 클릭합니다. 여기에서 자체 HTTP 프록시 설정을 정의할 수 있습니다.

또는 에뮬레이터를 시작할 때 -http-proxy <proxy> 옵션을 사용하여 명령줄에서 프록시를 구성할 수 있습니다. 이 경우 <proxy> 에 프록시 정보를 다음 중 하나의 형식으로 지정합니다.

http://<machineName>:<port>

또는

http://<username>:<password>@<machineName>:<port>

-http-proxy 옵션은 에뮬레이터가 모든 나가는 TCP 연결에 지정된 HTTP/HTTPS 프록시를 사용하도록 강제합니다. UDP의 리디렉션은 현재 지원되지 않습니다.

또는 환경 변수 http_proxy를 사용하려는 <proxy> 값으로 정의할 수 있습니다. 이 경우 -http-proxy 명령어에서 <proxy> 값을 지정할 필요가 없습니다. 에뮬레이터가 시작할 때 환경 변수 http_proxy 값을 확인하고 정의된 경우 그 값을 자동으로 사용합니다.

-debug-proxy 옵션을 사용하여 프록시 연결 문제를 진단할 수 있습니다.

에뮬레이터 인스턴스 상호 연결하기

에뮬레이터 인스턴스 하나가 다른 에뮬레이터 인스턴스와 통신할 수 있게 하려면 아래에서 보여주듯 필요한 네트워크 리디렉션을 설정해야 합니다.

환경이 다음과 같다고 가정합니다.

  • A는 개발용 컴퓨터입니다.
  • B는 A에서 실행되는 첫 번째 에뮬레이터 인스턴스입니다.
  • C는 두 번째 에뮬레이터 인스턴스이며 또한 A에서 실행됩니다.

C가 연결될 B에서 서버를 실행하려면 다음과 같이 설정합니다.

  1. 10.0.2.15:<serverPort>를 수신 대기하는 서버를 B에 설정합니다.
  2. B 콘솔에서 A:localhost:<localPort>에서 B:10.0.2.15:<serverPort>로 리디렉션을 설정합니다.
  3. C에서 클라이언트를 10.0.2.2:<localPort>에 연결합니다.

예를 들어, HTTP 서버를 실행하려는 경우 <serverPort>를 80으로, <localPort>를 8080으로 선택할 수 있습니다.

  • B는 10.0.2.15:80을 수신 대기합니다.
  • B 콘솔에서 redir add tcp:8080:80을 실행합니다.
  • C는 10.0.2.2:8080에 연결됩니다.

다른 에뮬레이터 인스턴스로 음성 통화 또는 SMS 보내기

에뮬레이터는 시뮬레이션된 음성 통화 및 SMS 메시지를 한 인스턴스에서 다른 인스턴스로 자동 전달합니다. 음성 통화 또는 SMS를 보내려면 에뮬레이터 중 하나에서 다이얼러 앱 또는 SMS 앱을 각각 사용하세요.

다른 에뮬레이터 인스턴스로 시뮬레이션된 음성 통화를 시작하려면 다음 단계를 따르세요.

  1. 발신 에뮬레이터 인스턴스에서 다이얼러 앱을 실행합니다.
  2. 호출하려는 인스턴스의 콘솔 포트 번호를 전화할 번호로 입력합니다. 창 제목을 확인하여 타겟 인스턴스의 콘솔 포트 번호를 확인할 수 있습니다. 여기서 콘솔 포트 번호는 'Android Emulator(<port>)로 보고됩니다.
  3. '다이얼'을 누릅니다. 타겟 에뮬레이터 인스턴스에 새 인바운드 호출이 표시됩니다.

다른 에뮬레이터 인스턴스에 SMS 메시지를 보내려면 SMS 앱을 실행합니다(사용 가능한 경우). 타겟 에뮬레이터 인스턴스의 콘솔 포트 번호를 SMS 주소로 지정하고 메시지 텍스트를 입력한 후 메시지를 전송합니다. 메시지가 타겟 에뮬레이터 인스턴스로 전달됩니다.

에뮬레이터 콘솔에 연결하여 수신 음성 통화 또는 SMS를 시뮬레이션 할 수도 있습니다. 자세한 내용은 전화 에뮬레이션SMS 에뮬레이션을 참조하세요.