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 이더넷을 사용하여 연결된 경우 에뮬레이션된 기기 네트워크
10.0.2.16 Wi-Fi를 사용하여 연결된 경우 에뮬레이션된 기기 네트워크
127.0.0.1 에뮬레이션된 기기 루프백 인터페이스

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

개발 머신의 주소 127.0.0.1은 에뮬레이터의 루프백 인터페이스에 상응합니다. 개발 머신 루프백 인터페이스에서 실행 중인 서비스에 액세스하려면 특수 주소 10.0.2.2를 대신 사용하세요.

에뮬레이션된 기기의 미리 할당된 주소는 Android Emulator에 따라 다르며 실제 기기에서는 매우 다를 수 있습니다(특히 라우터나 방화벽 뒤에서 네트워크 주소가 변환될 가능성도 매우 높음).

로컬 네트워킹 제한

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

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

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

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

네트워크 리디렉션 사용

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

네트워크 리디렉션을 설정하려면 에뮬레이터 인스턴스에서 호스트 및 게스트 포트와 주소의 매핑을 만듭니다. 네트워크 리디렉션을 설정하는 방법에는 두 가지가 있습니다. 다음 섹션에서 설명하는 것처럼 에뮬레이터 콘솔 명령어를 사용하는 방법과 Android 디버그 브리지(adb) 도구를 사용하는 방법입니다.

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

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

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

telnet localhost 5554

연결된 후에는 인증을 해야 리디렉션을 설정할 수 있습니다. 자세한 방법은 콘솔 세션 시작 및 중지를 참고하세요. 인증되면 redir 명령어를 사용하여 리디렉션 작업을 실행합니다.

리디렉션을 추가하려면 다음을 사용합니다.

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

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

프록시로 에뮬레이터 사용

많은 회사 네트워크에서는 네트워크 관리자가 인터넷 직접 연결을 거부합니다. 대신 인터넷 연결은 특정 프록시를 통과해야 합니다. 프록시 요구사항이 있는 네트워크에서 인터넷에 액세스하려면 에뮬레이터에서 프록시가 있고 그 프록시에 연결해야 함을 알고 있어야 합니다.

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

에뮬레이터가 프록시 서버를 통해 인터넷에 액세스해야 한다면 에뮬레이터의 Extended controls 화면에서 사용자설정 HTTP 프록시를 구성할 수 있습니다.

  1. 에뮬레이터가 열린 상태에서 More 를 클릭합니다.
  2. SettingsProxy를 클릭합니다.
  3. 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>)'로 보고됩니다.

    또는 adb devices 명령어가 실행 중인 가상 기기 및 그 콘솔 포트 번호의 목록을 출력합니다. 자세한 내용은 기기 쿼리를 참고하세요.

  3. 다이얼 버튼을 클릭합니다. 타겟 에뮬레이터 인스턴스에 새 인바운드 호출이 표시됩니다.

다른 에뮬레이터 인스턴스로 SMS 메시지를 보내려면 다음 단계를 따르세요.

  1. SMS 앱을 실행합니다(가능한 경우).
  2. 타겟 에뮬레이터 인스턴스의 콘솔 포트 번호를 SMS 주소로 지정합니다.
  3. 메시지 본문을 입력합니다.
  4. 메시지를 보냅니다. 메시지가 타겟 에뮬레이터 인스턴스로 전달됩니다.
  5. 에뮬레이터 콘솔에 연결하여 수신 음성 통화 또는 SMS를 시뮬레이션할 수도 있습니다. 자세한 내용은 전화 통신 에뮬레이션SMS 에뮬레이션을 참고하세요.