Lựa chọn mạng

Trang này mô tả cách Android chọn trong số các mạng có sẵn đồng thời. Cơ chế chọn mạng này ảnh hưởng đến cách Android thực hiện các yêu cầu mạng của ứng dụng và hệ thống, đồng thời ảnh hưởng đến cách Android chọn mạng mặc định cho một ứng dụng.

Hành vi lựa chọn mạng

Phần này mô tả hành vi chọn mạng cho các thiết bị chạy Android 12 trở lên và cho các thiết bị chạy Android 11 (API cấp 30) trở xuống.

Android 12

Đối với các thiết bị chạy Android 12 trở lên, Android sử dụng lớp NetworkScore để chọn trong số các mạng có sẵn. Lớp này chứa các cờ đưa ra quyết định về chính sách. Mỗi cờ đại diện cho một thuộc tính mạng quan trọng đối với việc chọn mạng.

Một tác nhân mạng (NetworkAgent) sử dụng cờ POLICY_TRANSPORT_PRIMARY để chỉ định rằng Android ưu tiên mạng nếu có nhiều mạng có cùng phương thức truyền tải. Ví dụ: thiết bị có 2 SIM có một nút chuyển trong phần Cài đặt cho phép bạn chọn thẻ SIM sẽ dùng theo mặc định. Trong một phương thức truyền tải nhất định, Android ưu tiên mạng có cờ POLICY_TRANSPORT_PRIMARY hơn mạng không có cờ này.

Một tác nhân mạng sử dụng cờ POLICY_EXITING để xác định một mạng dự kiến sẽ ngắt kết nối. Ví dụ: chất lượng mạng Wi-Fi sẽ giảm nếu người dùng đi ra ngoài phạm vi phủ sóng của mạng. Android tránh sử dụng mạng có cờ này nếu có mạng khác không có cờ này. Mỗi tác nhân mạng có thể xác định thời điểm mạng xuống cấp đến mức cần phải thoát.

Lớp NetworkScore cũng cho phép một tác nhân mạng khai báo rằng Android duy trì kết nối mạng bằng cách sử dụng cờ KEEP_CONNECTED_FOR_HANDOVER và phương thức NetworkScore.Builder.setKeepConnectedReason. Cờ KEEP_CONNECTED_FOR_HANDOVER này giúp các mạng lưới tiềm năng. Cờ này cho phép một tác nhân mạng đưa một mạng lên STA Wi-Fi phụ mà không cần biến mạng đó thành mạng chính cho đến khi Android đánh giá hiệu suất của mạng. Nếu một tác nhân mạng không khai báo cờ này, thì Android sẽ huỷ các mạng dự kiến vì không phục vụ bất kỳ yêu cầu nào trước khi tác nhân đánh giá hiệu suất của một mạng.

Nếu hai mạng có thể phân phát một yêu cầu nhất định và có chính sách tương đương, thì Android sẽ ưu tiên mạng đang phân phát yêu cầu đó. Nếu không có mạng nào phân phát yêu cầu, Android sẽ chọn một trong hai. Mạng này vẫn là mạng ưu tiên cho đến khi cờ chính sách thay đổi.

Tính năng chọn mạng được triển khai trong mô-đun Kết nối trong Dự án nguồn mở Android (AOSP). Logic chính sách để chọn mạng nằm trong lớp NetworkRanker và các lớp trợ giúp của lớp này. Điều này có nghĩa là các nhà sản xuất thiết bị không thể tuỳ chỉnh trực tiếp mã chọn mạng. Thay vào đó, họ phải sử dụng các cờ trong NetworkScore để truyền tải thông tin về các mạng.

Android 11

Đối với các thiết bị chạy Android 11 trở xuống, Android thực hiện lựa chọn mạng dựa trên một số nguyên do một tác nhân mạng gửi (NetworkAgent). Đối với mỗi yêu cầu, Android sẽ chọn mạng có điểm số bằng số cao nhất có thể đáp ứng yêu cầu. Điểm số bằng số này bao gồm số nguyên mà tác nhân mạng gửi cộng với các điểm thưởng hoặc điểm phạt bổ sung. Android áp dụng các khoản thưởng hoặc phạt này dựa trên các điều kiện, chẳng hạn như mạng có được xác thực hay không hoặc có phải là VPN hay không. Các tác nhân mạng đồng bộ hoá với nhau để đưa ra quyết định về chính sách.

Nếu hai mạng có thể phân phát một yêu cầu nhất định và có cùng điểm số bằng số, thì hành vi sẽ không xác định.

Lớp NetworkScore

Lớp NetworkScore là trọng tâm của tính năng chọn mạng. Lớp này chứa API và tài liệu cho các cờ có sẵn và phương thức NetworkScore.Builder.setKeepConnectedReason.

Bạn phải tạo lớp NetworkScore bằng lớp trình tạo tương ứng và truyền lớp đó đến hàm khởi tạo NetworkAgent trong quá trình khởi chạy. Bạn có thể cập nhật điểm số mạng bất cứ lúc nào bằng phương thức NetworkAgent#sendNetworkScore.

Ví dụ về cách triển khai tác nhân mạng

AOSP bao gồm các ví dụ về việc triển khai nhiều tác nhân mạng. Danh sách sau đây cung cấp các ví dụ về cách triển khai:

  • TelephonyNetworkAgent: Sử dụng điểm số mạng để truyền đạt chính sách cho mạng di động.
  • ClientModeImpl.WifiNetworkAgent: Sử dụng điểm số mạng để truyền đạt chính sách cho mạng Wi-Fi. Phương thức triển khai này cung cấp khả năng tương thích ngược với số nguyên cũ cho điểm mạng bằng cách sử dụng cờ POLICY_EXITING.

Thiết bị nâng cấp lên Android 12

Nhà sản xuất thiết bị nâng cấp thiết bị lên Android 12 phải sửa đổi việc triển khai tác nhân mạng để sử dụng lớp NetworkScore. Số nguyên cũ được dùng trong Android 11 trở xuống sẽ được truyền trong NetworkScore nhưng chỉ dùng cho mục đích ghi nhật ký và không hồi quy trong Android 12. Trong Android 12, nhà sản xuất thiết bị phải thể hiện các thay đổi bằng cách sử dụng cờ NetworkScore. Sau đó, mô-đun Connectivity Mainline sẽ sử dụng các cờ này để đưa ra quyết định chọn mạng. Các nhà sản xuất thiết bị sử dụng mã cho Android 11 trở xuống nhưng tạo dựa trên việc triển khai trong Android 12 có thể gặp lỗi khi tạo vì các phương thức cập nhật số nguyên cũ đã bị xoá trong Android 12.

Đối với những tác nhân mạng sử dụng lớp NetworkFactory nội bộ, bạn phải biểu thị bộ lọc điểm số trong một đối tượng NetworkScore đại diện cho điểm số cao nhất của một mạng mà nhà máy có thể tạo. Điều này là do trong Android 12, lớp NetworkFactory chỉ truyền các yêu cầu khớp với bộ lọc điểm được khai báo cho NetworkFactory, không giống như trong Android 11 trở xuống, nơi lớp này truyền tất cả các yêu cầu.

Bạn có thể truyền một bộ lọc để đơn giản hoá việc triển khai và tiết kiệm pin, đảm bảo rằng NetworkFactory không xử lý tất cả các yêu cầu. Tuy nhiên, nếu quá trình triển khai tuỳ chỉnh của bạn yêu cầu tất cả các yêu cầu phải được truyền đến NetworkFactory, bạn có thể đăng ký NetworkFactory.registerIgnoringScore thay vì phương thức NetworkFactory.register thông thường. Nếu bạn sử dụng phương pháp này, hãy truyền một bộ lọc điểm số thể hiện chính xác nhất điểm số tốt nhất mà nhà máy có thể tạo ra. Việc này giúp tiết kiệm pin bằng cách ngăn chặn việc đánh giá các yêu cầu mà nhà máy không thể thực hiện.

Xác nhận kết quả

Để xác minh hành vi chọn mạng trên một thiết bị chạy Android, hãy sử dụng các kiểm thử sau:

  • NetworkScoreTest Kiểm thử CTS
  • Kiểm thử đơn vị NetworkRanker

Việc triển khai không chính xác có thể dẫn đến các mạng không mong muốn quay trở lại ứng dụng khi ứng dụng sử dụng NetworkCallback. Điều này bao gồm việc chọn mạng mặc định của thiết bị (mạng mà hệ thống gửi đến một ứng dụng khi ứng dụng đó sử dụng một lệnh gọi lại mạng, ví dụ: với ConnectivityManager.registerDefaultNetworkCallback).

Một vấn đề khác có thể xảy ra do việc triển khai không chính xác là tình trạng hao pin nghiêm trọng. Điều này xảy ra khi một tác nhân mạng được đưa lên với điểm số không cho phép tác nhân đó đủ điều kiện cho bất kỳ yêu cầu nào và bị loại bỏ ngay sau đó. Nếu tác nhân liên tục khởi động và tắt, thì điều này có thể tiêu hao đáng kể pin.