Trang này mô tả cách Android chọn giữa các mạng có sẵn đồng thời. Cơ chế lựa 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 chọn mạng mặc định cho một ứng dụng.
Hành vi chọn mạng
Phần này mô tả hành vi lựa 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 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 giữa các mạng có sẵn. Lớp này có chứa một số
cờ bắt buộc để đưa ra quyết định về chính sách. Mỗi cờ đại diện về mặt ngữ nghĩa cho một thuộc tính của mạng quan trọng đối với việc lựa chọn mạng.
Một tác nhân mạng
(NetworkAgent
)
sử dụng
POLICY_TRANSPORT_PRIMARY
cờ để chỉ định rằng một mạng được ưu tiên khi có nhiều mạng của cùng một mạng
có sẵn phương tiện vận chuyển. Một ví dụ điển hình về điều này là thiết bị có hai SIM có một nút chuyển trong phần Cài đặt để cho phép người dùng chọn thẻ SIM nào sẽ 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ờ.
Tác nhân mạng sử dụng cờ POLICY_EXITING
để xác định một mạng dự kiến sẽ sớm ngắt kết nối. Một giá trị điển hình
ví dụ về trường hợp này là khi chất lượng mạng Wi-Fi bị suy giảm khi người dùng rời khỏi
phạm vi của mạng. Android sẽ tránh sử dụng mạng có cờ này nếu có một mạng khác không có cờ này. Mỗi tác nhân mạng riêng lẻ có thể xác định thời điểm một mạng bị suy giảm đủ để được coi là thoát.
Lớp NetworkScore
cũng cho phép tác nhân mạng khai báo rằng một mạng
được theo dõi bằng cách sử dụng
KEEP_CONNECTED_FOR_HANDOVER
cờ và
NetworkScore.Builder.setKeepConnectedReason
. Chiến dịch này
KEEP_CONNECTED_FOR_HANDOVER
cờ hữu ích cho các mạng tiềm năng cho phép tác nhân mạng đưa ra
trên một STA Wi-Fi phụ mà không đặt đó làm mạng chính cho đến khi
hiệu suất mạng sẽ được đánh giá. Nếu tác nhân mạng không khai báo thông tin này
các mạng tiềm năng đã bị gỡ bỏ do không đáp ứng được bất kỳ yêu cầu nào trước đó
nhân viên hỗ trợ có cơ hội đánh giá hiệu suất của mạng.
Nếu hai mạng có thể phân phát một yêu cầu nhất định và tương đương nhau từ quan điểm chính sách, thì lựa chọn 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, hệ thống sẽ chọn một trong hai mạng sau mà mạng này sẽ tiếp tục được ưu tiên cho đến khi cờ chính sách thay đổi.
Việc triển khai tính năng chọn mạng nằm trong
Mô-đun kết nối
trong AOSP. Bạn có thể tìm thấy logic chính sách để lựa chọn mạng 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à nhà sản xuất thiết bị không thể trực tiếp tuỳ chỉnh mã lựa chọn mạng mà phải sử dụng cờ trong NetworkScore
để truyền đạt thông tin bắt buộc về mạng.
Android 11
Đối với các thiết bị chạy Android 11 trở xuống, Android sẽ thực hiện lựa chọn mạng dựa trên một số nguyên đơn giản được gửi từ các hoạt động triển khai của tác nhân mạng (NetworkAgent
). Đối với mỗi yêu cầu, Android sẽ chọn mạng có điểm số dạng số cao nhất có thể đáp ứng yêu cầu. Điểm số dạng số này bao gồm số nguyên do 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 được đưa ra dựa trên một số điều kiện, chẳng hạn như liệu mạng có được xác thực hay không hoặc liệu mạng có phải là VPN hay không. Các tác nhân mạng riêng lẻ đồng bộ hoá với nhau theo thứ tự
để đư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ố, thì chưa được xác định.
Lớp NetworkScore
Lớp trung tâm cho tính năng lựa chọn mạng là NetworkScore
.
Lớp này chứa API và tài liệu về các cờ hiện có cũng như phương thức setKeepConnectedReason
.
Bạn phải tạo lớp NetworkScore
thông qua lớp trình tạo và truyền lớp này vào hàm khởi tạo NetworkAgent
khi khởi tạo. Bạn có thể cập nhật điểm 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ề cách triển khai nhiều tác nhân mạng. Sau đây là ví dụ về cách triển khai:
TelephonyNetworkAgent
: Sử dụng điểm mạng để thông báo chính sách cho mạng di độngClientModeImpl.WifiNetworkAgent
: Sử dụng điểm số mạng để giao tiếp chính sách cho mạng Wi-Fi. Phương thức triển khai này bao gồm 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 cách 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 được truyền vào NetworkScore
nhưng chỉ được dùng
để ghi nhật ký và cho mục đích 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 mong muốn bằng cờ NetworkScore
. Mô-đun Connectivity Mainline
sau đó sử dụng cờ để đưa ra quyết định lựa chọn mạng. Thiết bị
đang sử dụng mã dành cho Android 11 trở xuống nhưng xây dựng dựa trên
triển khai trong Android 12 có thể gặp lỗi bản dựng
vì các phương thức để cập nhật số nguyên cũ đã bị xoá trong
Android 12.
Đối với các tác nhân mạng sử dụng
NetworkFactory
lớp, các đối tượng đó phải thể hiện bộ lọc điểm số trong một đối tượng NetworkScore
thể hiện điểm số mạnh nhất của một mạng mà nhà máy có thể tạo ra. Đây là
vì trong Android 12, chỉ lớp NetworkFactory
chuyển các yêu cầu khớp với bộ lọc điểm số đã khai báo cho NetworkFactory
thay vì tất cả các yêu cầu trong Android 11 trở xuống.
Bạn nên truyền một bộ lọc để dễ dàng triển khai và tiết kiệm pin hơn, nhờ đó không phải tất cả yêu cầu đều được truyền đến NetworkFactory
. Tuy nhiên, nếu phương thức triển khai tuỳ chỉnh 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 sử dụng phương pháp này, bạn nên chuyển bộ lọc điểm số
thể hiện chính xác nhất điểm số cao nhất mà nhà máy có thể tạo ra để
tiết kiệm pin bằng cách không đá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 lựa chọn mạng trên thiết bị Android, hãy sử dụng các kiểm thử sau:
NetworkScoreTest
Kiểm thử CTSNetworkRanker
kiểm thử đơn vị
Triển khai không đúng cách có thể dẫn đến việc các mạng không mong muốn bị trả về
các ứng dụng phù hợp với việc họ sử dụng
NetworkCallback
,
bao gồm cả việc chọn mạng mặc định của thiết bị (mạng mà hệ thống
gửi đến ứng dụng khi họ sử dụng lệnh gọi lại mạng với
ConnectivityManager.registerDefaultNetworkCallback
).
Một vấn đề khác có thể xảy ra khi triển khai không chính xác là tình trạng hao pin nghiêm trọng do tác nhân mạng được đưa ra với điểm số không đủ điều kiện cho bất kỳ yêu cầu nào và bị phá bỏ ngay sau đó. Nếu nhân viên hỗ trợ là điều này có thể tốn nhiều pin.