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 lựa chọn mạng
Phần này mô tả hành vi lựa chọn mạng cho thiết bị chạy Android 12 trở lên và 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 chứa một số cờ cần thiết để đư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.
Tác nhân mạng (NetworkAgent
) sử dụng cờ POLICY_TRANSPORT_PRIMARY
để chỉ định rằng mạng được ưu tiên khi có nhiều mạng của cùng một phương thức truyền tải. 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ột mạng có cờ POLICY_TRANSPORT_PRIMARY
hơn một 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 ví dụ điển hình về điều này là khi chất lượng mạng Wi-Fi giảm khi người dùng đi ra 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 suy giảm đến mức được xem là đang 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 sẽ được duy trì 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 rất hữu ích cho các mạng tiềm năng, cho phép tác nhân mạng hiển thị một mạng trên STA Wi-Fi phụ mà không cần đặt mạng đó làm mạng chính cho đến khi đá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ì các mạng tiềm năng sẽ bị huỷ bỏ do không xử lý yêu cầu nào trước khi tác nhân 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 theo 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, thì hệ thống sẽ chọn một trong hai mạng, sau đó mạng này sẽ tiếp tục được ưu tiên cho đến khi cờ chính sách thay đổi.
Phương thức triển khai tính năng lựa 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 tương ứng. Đ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 khoản thưởng hoặc 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 để đư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ố dạng số, thì hành vi này sẽ không xác định.
Lớp NetworkScore
Lớp trung tâm cho tính năng 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 mạng để thông báo 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ũ dùng trong Android 11 trở xuống được truyền vào NetworkScore
nhưng chỉ 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
. Sau đó, mô-đun Connectivity Mainline sẽ sử dụng các cờ này để đưa ra quyết định lựa chọn mạng. Các nhà sản xuất thiết bị sử dụng mã Android 11 trở xuống nhưng xây dựng dựa trên cách triển khai Android 12 có thể gặp phải 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 lớp NetworkFactory
nội bộ, các tác nhân này phải thể hiện bộ lọc điểm số trong đối tượng NetworkScore
đại diện cho điểm số mạnh 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ỉ 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 chuyển 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 chuyể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 thức này, bạn nên 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 để 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 bài 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 việc các mạng không mong muốn được trả về cho ứng dụng để phản hồ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 ứng dụng sử dụng lệnh gọi lại mạng bằng ConnectivityManager.registerDefaultNetworkCallback
).
Một vấn đề khác có thể xảy ra với việc triển khai không chính xác là tiêu hao pin nghiêm trọng do một tác nhân mạng xuất hiện đ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ị gỡ bỏ ngay sau đó. Nếu tác nhân này được kích hoạt và gỡ xuống nhiều lần, thì việc này có thể tiêu hao nhiều pin.