設定 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 工具,如下所述。

透過 Emulator 主控台設定重新導向

每個模擬器執行個體都提供控管用的主控台,您可以連線到主控台,下達該執行個體專屬的指令。您可以使用 redir 主控台指令,視需要設定重新導向模擬器執行個體。

首先,請確定目標模擬器執行個體的主控台通訊埠號碼。舉例來說,第一個啟動的模擬器執行個體的主控台通訊埠號碼為 5554。接著,連線至目標模擬器執行個體的主控台,指定主控台的通訊埠號碼,如下所示:

telnet localhost 5554

連線後,請使用 redir 指令來處理重新導向。如要新增重新導向,請使用以下指令:

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

其中 <protocol>tcpudp,而 <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 Debug Bridge (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 解析問題 (例如使用網路瀏覽器時,出現「不明主機錯誤」訊息),這個選項或許能帶來幫助。

將模擬器與 Proxy 搭配使用

在許多公司網路中,無法直接連線至網際網路 (網路管理員會拒絕連線),除非透過特定 Proxy 建立連線。網路瀏覽器和其他公司應用程式均已預先設定為使用 Proxy,讓您可以瀏覽網路。模擬器等一般應用程式需要知道是否有 Proxy,以及需要連線至該 Proxy。

由於 HTTP 的特性,網路伺服器直接連線和透過 Proxy 的連線會導致不同的 GET 要求。模擬器會公開重寫來自虛擬裝置的 GET 要求,然後再與 Proxy 通訊,才能順利執行。

如果模擬器必須透過 Proxy 伺服器存取網際網路,您可以在模擬器的「Extended controls」畫面中設定自訂 HTTP Proxy。開啟模擬器後,依序點選「More」(更多選項) >「Settings」(設定) >「Proxy」。您可以在這裡定義自己的 HTTP Proxy 設定。

或者,您也可以在啟動模擬器時,透過 -http-proxy <proxy> 選項從指令列設定 Proxy。在這種情況下,請以下列任一格式在 <proxy> 中指定 Proxy 資訊:

http://<machineName>:<port>

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

-http-proxy 選項會強制模擬器對所有傳出的 TCP 連線使用指定的 HTTP/HTTPS Proxy。目前不支援 UDP 的重新導向。

或者,您也可以將環境變數 http_proxy 定義為要用於 <proxy> 的值。在這種情況下,您不需要在 -http-proxy 指令中指定 <proxy> 的值;模擬器會在啟動時檢查 http_proxy 環境變數的值,並自動使用該值 (如已定義)。

您可以使用 -debug-proxy 選項診斷 Proxy 連線問題。

互連模擬器執行個體

如要允許模擬器執行個體互相通訊,您必須設定必要的網路重新導向,如下所示。

假設環境

  • A 是您的開發機器
  • B 是您在 A 上執行的第一個模擬器執行個體
  • C 是第二個模擬器執行個體,也在 A 上執行

您想讓 C 連線至您在 B 上執行的伺服器,設定方法如下:

  1. 在 B 上設定伺服器,監聽 10.0.2.15:<serverPort>
  2. 在 B 主控台上,設定從 A:localhost:<localPort> 重新導向至 B:10.0.2.15:<serverPort>
  3. 在 C 上,讓用戶端連線至 10.0.2.2:<localPort>

舉例來說,如果要執行 HTTP 伺服器,您可以選擇 80 做為 <serverPort>,並將 <localPort> 指定為 8080:

  • B 監聽 10.0.2.15:80
  • 在 B 主控台上下達 redir add tcp:8080:80
  • C 會連線至 10.0.2.2:8080

傳送語音通話或簡訊到其他模擬器執行個體

模擬器會自動將模擬的語音通話和簡訊從某個執行個體轉送到另一個執行個體。如要傳送語音通話或簡訊,請分別使用任一模擬器的撥號應用程式或訊息應用程式。

如要向其他模擬器執行個體發起模擬語音通話,請按照下列步驟操作:

  1. 啟動來源模擬器執行個體上的撥號應用程式。
  2. 請輸入通話目標執行個體的主控台通訊埠號碼,做為撥打號碼。如要確認目標執行個體的主控台通訊埠號碼,您可以查看該執行個體的視窗名稱,其中主控台通訊埠號碼會回報為「Android Emulator (<通訊埠>)」。
  3. 按下「Dial」,新的輸入呼叫就會出現在目標模擬器執行個體中。

如要傳送簡訊給其他模擬器執行個體,請啟動訊息應用程式 (如果有的話)。將目標模擬器執行個體的主控台通訊埠號碼指定為簡訊地址,輸入訊息文字,然後傳送訊息。訊息會傳送至目標模擬器執行個體。

您也可以連線至模擬器主控台,藉此模擬來電或收到的簡訊。詳情請參閱「電話模擬」和「簡訊模擬」。