設定 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 使用乙太網路連線時模擬的裝置網路
2016 年 10 月 21 日 使用 Wi-Fi 連線時的模擬裝置網路
127.0.0.1 模擬裝置回送介面

所有執行中的模擬器執行個體都使用相同的指派位址。也就是說,如果您在機器上同時執行兩個執行個體,每個執行個體都會有各自的路由器,而每個路由器後方都會有一個 10.0.2.15 IP 位址。執行個體由路由器隔離,無法在同一個網路中偵測到彼此。如要瞭解如何讓模擬器執行個體透過 TCP/UDP 進行通訊,請參閱「互連模擬器執行個體」一節。

開發機器上的位址 127.0.0.1 會對應至模擬器的回送介面。如要存取在開發機器回送介面上執行的服務,請改用特殊位址 10.0.2.2。

模擬裝置的預先分配位址為 Android Emulator 專用,且可能和實際裝置上的情況相差甚遠 (通常也會經過網路位址轉譯,特別是在路由器或防火牆後方)。

區域網路限制

在模擬器上執行的 Android 應用程式可以連線至工作站的可用網路。不過,應用程式是透過模擬器連線,而非直接連線至硬體,而模擬器的運作方式就如同工作站上的一般應用程式。這可能會造成下列限制:

  • 機器上執行的防火牆程式可能會封鎖與模擬裝置的通訊。
  • 與機器連線的另一個 (實體) 防火牆或路由器可能會封鎖與模擬器裝置的通訊。

模擬器的虛擬路由器應足以代表模擬裝置處理所有輸出的 TCP 和 UDP 連線與訊息,前提是您的開發機器網路環境允許這麼做。除了主機作業系統和網路的限制外,通訊埠號碼或範圍沒有內建限制。

根據環境的不同,模擬器可能不支援其他通訊協定 (例如用於「連線偵測」(ping) 的 ICMP)。模擬器目前不支援 IGMP 或多點傳播。

使用網路重新導向

如要與虛擬路由器後方的模擬器執行個體通訊,請在虛擬路由器上設定網路重新導向。接著,用戶端可以連線至路由器上的特定訪客通訊埠,而路由器則會來回導向該通訊埠與模擬裝置主機通訊埠之間的流量。

如要設定網路重新導向,請在模擬器執行個體上建立主機和訪客通訊埠與位址的對應關係。設定網路重新導向的方法有兩種:使用模擬器主控台指令和使用 Android Debug Bridge (adb) 工具,如以下各節所述。

透過模擬器主控台設定重新導向

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

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

telnet localhost 5554

連線完成後,您必須先進行驗證才能設定重新導向。操作詳情請參閱「啟動及停止主控台工作階段」相關說明。驗證完成後,請使用 redir 指令處理重新導向。

如要新增重新導向,請使用以下指令:

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 和 macOS 上,模擬器會經由剖析 /etc/resolv.conf 檔案取得 DNS 伺服器位址。在 Windows 上,模擬器會透過呼叫 GetNetworkParams() API 取得位址。請注意,通常這表示模擬器會忽略「主機」檔案 (在 Linux/macOS 為 /etc/hosts,在 Windows 為 %WINDOWS%/system32/HOSTS) 的內容。

透過指令列啟動模擬器時,您可以使用 -dns-server <serverList> 選項手動指定要使用的 DNS 伺服器位址,其中 <serverList> 是以半形逗號分隔的伺服器名稱或 IP 位址清單。如果在模擬網路中遇到 DNS 解析問題 (例如使用網路瀏覽器時,出現「不明主機錯誤」訊息),這個選項或許能帶來幫助。

搭配 Proxy 使用模擬器

在許多公司網路中,網路管理員會拒絕與網際網路直接連線,因此網際網路連線必須透過特定的 Proxy 進行。如要透過需要 Proxy 的網路存取網際網路,模擬器必須知道系統有設置 Proxy 且需要與其連線。

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

如果模擬器必須透過 Proxy 伺服器存取網際網路,您可以在模擬器的「Extended controls」畫面中設定自訂 HTTP Proxy:

  1. 開啟模擬器後,按一下「More」圖示
  2. 依序點選「Settings」和「Proxy」
  3. 定義 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 (<通訊埠>)」。

    此外,adb devices 指令會顯示執行中的虛擬裝置及其主控台通訊埠號碼清單。詳情請參閱「查詢裝置」相關說明。

  3. 按一下撥號按鈕。新的來電就會顯示在目標模擬器執行個體中。

如何傳送簡訊給其他模擬器執行個體:

  1. 啟動訊息應用程式 (如果有的話)。
  2. 將目標模擬器執行個體的主控台通訊埠號碼指定為簡訊地址。
  3. 輸入訊息文字。
  4. 送出這則訊息。訊息會傳送至目標模擬器執行個體。
  5. 您也可以連線至模擬器主控台,模擬收到來電或簡訊。詳情請參閱「電話通訊模擬」和「簡訊模擬」相關說明。