Thiết lập mạng cho Trình mô phỏng Android

Trình mô phỏng cung cấp các tính năng kết nối mạng linh hoạt mà bạn có thể dùng để thiết lập môi trường tạo mô hình và thử nghiệm phức tạp cho ứng dụng. Trang này giới thiệu cấu trúc và chức năng của mạng trình mô phỏng.

Không gian địa chỉ mạng

Mỗi thực thể của trình mô phỏng đều chạy sau một dịch vụ tường lửa/bộ định tuyến ảo để tách biệt thực thể đó với giao diện và chế độ cài đặt của mạng máy phát triển và với Internet. Thiết bị được mô phỏng không thể phát hiện thấy máy phát triển hoặc các thực thể khác của trình mô phỏng trên mạng. Thiết bị này chỉ phát hiện thấy thiết bị được kết nối với một bộ định tuyến hoặc tường lửa qua Ethernet.

Bộ định tuyến ảo của mỗi thực thể quản lý không gian địa chỉ mạng 10.0.2/24. Tất cả địa chỉ do bộ định tuyến quản lý đều có dạng 10.0.2.xx, trong đó xx là một số. Các địa chỉ trong không gian này được trình mô phỏng/bộ định tuyến phân bổ trước như sau:

Địa chỉ mạng Mô tả
10.0.2.1 Địa chỉ của bộ định tuyến hoặc cổng
10.0.2.2 Bí danh đặc biệt cho giao diện vòng lặp quy hồi (loopback) của máy chủ (127.0.0.1 trên máy phát triển của bạn)
10.0.2.3 Máy chủ DNS thứ nhất
10.0.2.4 / 10.0.2.5 / 10.0.2.6 Máy chủ DNS thứ hai, thứ ba và thứ tư là không bắt buộc
10.0.2.15 Giao diện mạng hoặc Ethernet của thiết bị được mô phỏng
127.0.0.1 Giao diện vòng lặp quy hồi (loopback) của thiết bị được mô phỏng

Tất cả các thực thể trình mô phỏng đang chạy đều sử dụng cùng một cách chỉ định địa chỉ. Điều đó có nghĩa là nếu bạn có hai thực thể chạy đồng thời trên máy, thì mỗi thực thể sẽ có bộ định tuyến riêng và sau bộ định tuyến đó thì mỗi thực thể sẽ có địa chỉ IP là 10.0.2.15. Các thực thể này được bộ định tuyến tách riêng và không thể phát hiện lẫn nhau trên cùng một mạng. Để biết thông tin về cách cho phép các thực thể trình mô phỏng giao tiếp qua TCP/UDP, hãy xem phần về kết nối các thực thể trình mô phỏng.

Địa chỉ 127.0.0.1 trên máy phát triển của bạn tương ứng với giao diện vòng lặp quy hồi (loopback) của trình mô phỏng. Để truy cập vào các dịch vụ chạy trên giao diện vòng lặp quy hồi (loopback) của máy phát triển, hãy dùng địa chỉ đặc biệt 10.0.2.2.

Địa chỉ được phân bổ trước của một thiết bị được mô phỏng là dành riêng cho Trình mô phỏng Android đó và có thể rất khác trên thiết bị thực (địa chỉ này cũng có thể là địa chỉ mạng được dịch, cụ thể là phía sau bộ định tuyến hoặc tường lửa).

Giới hạn về mạng cục bộ

Ứng dụng Android chạy trong trình mô phỏng có thể kết nối với mạng có sẵn trên máy trạm của bạn. Tuy nhiên, ứng dụng kết nối thông qua trình mô phỏng, chứ không kết nối trực tiếp với phần cứng, và trình mô phỏng hoạt động như một ứng dụng thông thường trên máy trạm. Điều này có thể gây ra một số hạn chế:

  • Chương trình tường lửa chạy trên máy có thể chặn hoạt động giao tiếp với thiết bị được mô phỏng.
  • Một tường lửa hoặc bộ định tuyến (thực tế) khác kết nối với máy của bạn có thể chặn hoạt động giao tiếp với thiết bị được mô phỏng.

Bộ định tuyến ảo của trình mô phỏng phải có khả năng thay thiết bị được mô phỏng xử lý tất cả các thông báo cũng như kết nối TCP và UDP chiều đi, miễn là môi trường mạng của máy phát triển cho phép bộ định tuyến đó làm như vậy. Không có giới hạn định sẵn về số lượng hoặc phạm vi cổng, chỉ có các giới hạn do mạng và hệ điều hành của máy chủ lưu trữ đặt ra.

Tuỳ thuộc vào môi trường, trình mô phỏng có thể không hỗ trợ được các giao thức khác (chẳng hạn như ICMP, dùng để "ping"). Hiện tại, trình mô phỏng không hỗ trợ IGMP hoặc phát đa hướng.

Sử dụng lệnh chuyển hướng mạng

Để giao tiếp với một thực thể trình mô phỏng nằm phía sau bộ định tuyến ảo, hãy thiết lập lệnh chuyển hướng mạng trên bộ định tuyến ảo đó. Khi đó, ứng dụng có thể kết nối với một cổng khách được chỉ định trên bộ định tuyến, trong khi bộ định tuyến chuyển hướng lưu lượng truy cập đến và từ cổng đó tới cổng máy chủ lưu trữ của thiết bị được mô phỏng.

Để thiết lập lệnh chuyển hướng mạng, bạn cần tạo liên kết giữa cổng và địa chỉ của máy chủ lưu trữ với cổng và địa chỉ của máy khách trên thực thể trình mô phỏng. Có hai cách để thiết lập lệnh chuyển hướng mạng, đó là: dùng các lệnh trong bảng điều khiển của trình mô phỏng và dùng công cụ Cầu gỡ lỗi Android (adb), như mô tả trong các phần sau.

Thiết lập lệnh chuyển hướng thông qua bảng điều khiển của trình mô phỏng

Mỗi thực thể trình mô phỏng cung cấp một bảng điều khiển mà bạn có thể kết nối để đưa ra lệnh dành riêng cho thực thể đó. Hãy dùng lệnh trong bảng điều khiển redir để thiết lập lệnh chuyển hướng, nếu cần, cho một thực thể trình mô phỏng.

Đầu tiên, xác định số cổng của bảng điều khiển cho thực thể trình mô phỏng đích. Ví dụ: số cổng của bảng điều khiển của phiên bản trình mô phỏng thứ nhất được chạy là 5554. Tiếp theo, kết nối với bảng điều khiển của thực thể trình mô phỏng đích, chỉ định số cổng cho bảng điều khiển của thực thể đó như sau:

telnet localhost 5554

Sau khi kết nối, bạn phải xác thực trước khi có thể thiết lập lệnh chuyển hướng. Xem phần Bắt đầu và dừng phiên điều khiển để biết thông tin chi tiết về cách thực hiện. Sau khi xác thực, hãy dùng lệnh redir để thao tác với lệnh chuyển hướng.

Để thêm lệnh chuyển hướng, hãy dùng:

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

Trong đó <protocol>tcp hoặc udp, còn <host-port><guest-port> sẽ thiết lập mối liên kết giữa máy của bạn và hệ thống được mô phỏng.

Ví dụ: lệnh sau đây thiết lập lệnh chuyển hướng xử lý tất cả các kết nối TCP đến máy chủ lưu trữ (máy phát triển) có địa chỉ 127.0.0.1:5000 và sẽ chuyển các kết nối này tới hệ thống được mô phỏng có địa chỉ 10.0.2.15:6000:

redir add tcp:5000:6000

Để xoá lệnh chuyển hướng, hãy dùng lệnh redir del. Để liệt kê tất cả các lệnh chuyển hướng cho một thực thể cụ thể, dùng redir list. Để biết thêm thông tin về các lệnh này và các lệnh khác trong bảng điều khiển, hãy xem phần Gửi lệnh trong bảng điều khiển của Trình mô phỏng.

Lưu ý rằng số cổng bị hạn chế theo môi trường địa phương. Điều này thường có nghĩa là bạn không thể dùng các số cổng máy chủ dưới 1024 nếu không có đặc quyền của quản trị viên. Ngoài ra, bạn sẽ không thể thiết lập lệnh chuyển hướng cho cổng máy chủ mà một quy trình khác đang sử dụng trên máy. Trong trường hợp đó, redir sẽ tạo một thông báo lỗi có ý nghĩa đó.

Thiết lập lệnh chuyển hướng thông qua adb

Công cụ Cầu gỡ lỗi Android (adb) cung cấp tính năng chuyển tiếp cổng, một cách thay thế để bạn thiết lập lệnh chuyển hướng mạng. Để biết thêm thông tin, hãy xem phần Thiết lập tính năng chuyển tiếp cổng trong tài liệu adb.

Lưu ý rằng adb hiện không cung cấp cách xoá lệnh chuyển hướng, ngoại trừ bằng cách dừng máy chủ adb.

Định cấu hình chế độ cài đặt DNS của trình mô phỏng

Khi khởi động, trình mô phỏng đọc danh sách máy chủ DNS mà hệ thống đang sử dụng. Sau đó, trình mô phỏng lưu trữ địa chỉ IP của tối đa 4 máy chủ trong danh sách này và thiết lập bí danh cho các máy chủ đó trên các địa chỉ được mô phỏng 10.0.2.3, 10.0.2.4, 10.0.2.5 và 10.0.2.6 nếu cần.

Trên Linux và macOS, trình mô phỏng lấy địa chỉ máy chủ DNS bằng cách phân tích cú pháp tệp /etc/resolv.conf. Trên Windows, trình mô phỏng lấy địa chỉ bằng cách gọi GetNetworkParams() API. Lưu ý rằng điều này thường có nghĩa là trình mô phỏng bỏ qua nội dung của tệp "hosts" (/etc/hosts trên Linux/macOS, %WINDOWS%/system32/HOSTS trên Windows).

Khi khởi động trình mô phỏng ở dòng lệnh, bạn có thể dùng tuỳ chọn -dns-server <serverList> để chỉ định thủ công địa chỉ máy chủ DNS sẽ sử dụng, trong đó <serverList> là danh sách tên máy chủ hoặc địa chỉ IP được phân tách bằng dấu phẩy. Bạn có thể thấy tuỳ chọn này hữu ích nếu gặp phải sự cố phân giải DNS trong mạng được mô phỏng (ví dụ: thông báo "Unknown Host error" (Lỗi máy chủ lưu trữ không xác định) xuất hiện khi dùng trình duyệt web).

Sử dụng trình mô phỏng với proxy

Trên nhiều mạng công ty, quản trị viên mạng từ chối kết nối trực tiếp với Internet. Thay vào đó, các kết nối Internet phải đi qua một proxy cụ thể. Để truy cập vào Internet trên một mạng có yêu cầu proxy, trình mô phỏng cần biết có proxy và cần kết nối với proxy đó.

Do tính chất của HTTP, kết nối máy chủ web trực tiếp và kết nối thông qua proxy sẽ dẫn đến các yêu cầu GET khác nhau. Trình mô phỏng ghi lại một cách rõ ràng các yêu cầu GET từ thiết bị ảo trước khi trao đổi với proxy để nó hoạt động.

Nếu trình mô phỏng phải truy cập vào Internet thông qua máy chủ proxy, thì bạn có thể định cấu hình proxy HTTP tuỳ chỉnh trên màn hình Extended controls (Điều khiển mở rộng) của trình mô phỏng:

  1. Khi trình mô phỏng đang mở, hãy nhấp vào biểu tượng Thêm .
  2. Nhấp vào Settings (Cài đặt) và Proxy.
  3. Xác định chế độ cài đặt proxy HTTP.

Ngoài ra, bạn có thể định cấu hình một proxy qua dòng lệnh bằng tuỳ chọn -http-proxy <proxy> khi khởi động trình mô phỏng. Trong trường hợp này, hãy chỉ định thông tin proxy theo <proxy> ở một trong các định dạng sau:

http://<machineName>:<port>

hoặc

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

Tuỳ chọn -http-proxy buộc trình mô phỏng phải dùng proxy HTTP hoặc HTTPS đã chỉ định cho tất cả các kết nối TCP đi. Lệnh chuyển hướng cho UDP không được hỗ trợ.

Ngoài ra, bạn có thể chỉ định biến môi trường http_proxy sang giá trị bạn muốn dùng cho <proxy>. Trong trường hợp này, bạn không cần chỉ định giá trị cho <proxy> trong lệnh -http-proxy – trình mô phỏng kiểm tra giá trị của biến môi trường http_proxy khi khởi động và tự động dùng giá trị của biến môi trường nếu đã chỉ định.

Bạn có thể dùng tuỳ chọn -debug-proxy để chẩn đoán các sự cố kết nối proxy.

Các thực thể trình mô phỏng nối kết với nhau

Để cho phép thực thể trình mô phỏng này giao tiếp với thực thể trình mô phỏng khác, hãy thiết lập lệnh chuyển hướng mạng như mô tả bên dưới.

Giả sử rằng môi trường của bạn được biểu thị như sau:

  • A là máy phát triển.
  • B là thực thể thứ nhất của trình mô phỏng, chạy trên A.
  • C là thực thể thứ hai của trình mô phỏng, cũng chạy trên A.

Nếu bạn muốn chạy một máy chủ trên B mà C sẽ kết nối, hãy thiết lập như sau:

  1. Thiết lập máy chủ trên B, đang theo dõi 10.0.2.15:<serverPort>.
  2. Trên bảng điều khiển B, thiết lập lệnh chuyển hướng từ A:localhost:<localPort> đến B:10.0.2.15:<serverPort>.
  3. Trên C, để ứng dụng kết nối với 10.0.2.2:<localPort>.

Ví dụ: nếu bạn muốn chạy máy chủ HTTP, hãy chọn <serverPort> là 80 và <localPort> là 8080:

  • B theo dõi 10.0.2.15:80.
  • Trên bảng điều khiển B, phát hành redir add tcp:8080:80.
  • C kết nối với 10.0.2.2:8080.

Gửi cuộc gọi thoại hoặc SMS đến một thực thể trình mô phỏng khác

Trình mô phỏng tự động chuyển tiếp cuộc gọi thoại và tin nhắn SMS được mô phỏng từ thực thể này sang thực thể khác. Để gửi cuộc gọi thoại hoặc SMS, hãy dùng ứng dụng quay số hoặc ứng dụng SMS tương ứng từ một trong các trình mô phỏng.

Cách bắt đầu cuộc gọi thoại được mô phỏng đến một phiên bản trình mô phỏng khác:

  1. Chạy ứng dụng chương trình gọi điện trên thực thể trình mô phỏng gốc.
  2. Nhập số điện thoại để gọi, đó chính là số cổng bảng điều khiển của thực thể đích.

    Bạn có thể xác định số cổng bảng điều khiển của thực thể đích bằng cách kiểm tra tiêu đề cửa sổ của thực thể đó, nếu thực thể đó đang chạy trong một cửa sổ riêng biệt, chứ không phải đang chạy trong cửa sổ công cụ. Số cổng của bảng điều khiển sẽ được báo cáo dưới dạng "Trình mô phỏng Android (<port>)".

    Ngoài ra, lệnh adb devices in ra danh sách các thiết bị ảo đang chạy và số cổng của bảng điều khiển tương ứng. Để biết thêm thông tin, hãy xem phần Truy vấn thiết bị.

  3. Nhấp vào nút gọi. Một cuộc gọi đến mới sẽ xuất hiện trong thực thể trình mô phỏng đích.

Cách gửi tin nhắn SMS đến một thực thể trình mô phỏng khác:

  1. Chạy ứng dụng SMS, nếu có.
  2. Chỉ định số cổng cho bảng điều khiển của thực thể trình mô phỏng đích đó dưới dạng địa chỉ SMS.
  3. Nhập nội dung tin nhắn.
  4. Gửi tin nhắn. Tin nhắn sẽ được gửi đến thực thể trình mô phỏng đích.
  5. Bạn cũng có thể kết nối với một bảng điều khiển trình mô phỏng để mô phỏng cuộc gọi thoại hoặc SMS đến. Để biết thêm thông tin, hãy xem phần Mô phỏng điện thoạiMô phỏng SMS.