Lựa chọn mạng

Trang này mô tả cách Android chọn giữa các mạng khả dụng đồng thời. Cơ chế chọn mạng này ảnh hưởng đến cách Android đáp ứng 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 ứ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 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 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 tiện vận chuyển. Một ví dụ điển hình về điều này là thiết bị hai SIM có nút chuyển trong 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 tiện 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ạ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 bước ra khỏ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 riêng lẻ có thể xác định thời điểm mạng xuống cấp đủ để đượ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ạng đượ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 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ạng trên STA Wi-Fi phụ mà không đặt mạng đó làm mạng chính cho đến khi hiệu suất của mạng được đánh giá. Nếu tác nhân mạng không khai báo cờ này, các mạng tiềm năng sẽ bị loại bỏ vì không phục vụ bất kỳ 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ục vụ 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 hiện đang phục vụ yêu cầu đó. Nếu không có mạng nào phục vụ yêu cầu, nó sẽ chọn một trong hai mạng, sau đó mạng này 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. Logic chính sách cho việc lựa chọn mạng được tìm thấy trong lớp NetworkRanker và các lớp trợ giúp của nó. Điều này có nghĩa là nhà sản xuất thiết bị không thể tùy chỉnh trực tiếp mã lựa chọn mạng mà thay vào đó phải sử dụng các cờ trong NetworkScore để truyền tải thông tin cần thiết về 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 đơn giản được gửi từ quá trình triển khai tác nhân mạng ( NetworkAgent ). Đối với mỗi yêu cầu, Android sẽ chọn mạng có số điểm cao nhất có thể đáp ứng yêu cầu. Điểm số này bao gồm số nguyên được gửi bởi đại lý mạng cộng với các khoản thưởng hoặc hình phạt bổ sung được đưa ra dựa trên một số điều kiện, chẳng hạn như mạng có được xác thực hay mạng đó có phải là VPN hay không. Các tác nhân mạng riêng lẻ đồng bộ hóa với nhau để đưa ra quyết định chính sách.

Nếu hai mạng có thể phục vụ một yêu cầu nhất định và có cùng số điểm thì hành vi đó không đượ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ờ có sẵn cũng như phương thức setKeepConnectedReason .

Lớp NetworkScore phải được xây dựng thông qua lớp trình tạo của nó và được chuyển tới hàm tạo NetworkAgent khi khởi tạo. Điểm mạng có thể được cập nhật bất kỳ lúc nào bằng phương pháp NetworkAgent#sendNetworkScore .

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

AOSP bao gồm việc triển khai ví dụ về các tác nhân mạng khác nhau. Sau đây là ví dụ triển khai:

  • TelephonyNetworkAgent : Sử dụng điểm mạng để truyền đạt chính sách cho mạng di động
  • ClientModeImpl.WifiNetworkAgent : Sử dụng điểm mạng để truyền đạt chính sách cho mạng Wi-Fi. Việ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ờ POLICY_EXITING .

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

Các nhà sản xuất thiết bị nâng cấp thiết bị của họ 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 chuyển vào 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 những thay đổi mong muốn bằng cách sử dụng cờ NetworkScore . Sau đó, mô-đun Connectivity Mainline sử dụng các cờ để đư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ã dành cho Android 11 trở xuống nhưng xây dựng dựa trên việc triển khai trong Android 12 có thể gặp lỗi bản dựng do các phương thức cập nhật số nguyên cũ đã bị xóa trong Android 12.

Đối với các tác nhân mạng sử dụng lớp NetworkFactory nội bộ, chúng phải thể hiện bộ lọc điểm của mình trong đối tượng NetworkScore đại diện cho điểm mạnh nhất của 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 được khai báo cho NetworkFactory thay vì tất cả các yêu cầu trong Android 11 trở xuống.

Chúng tôi khuyên bạn nên chuyển bộ lọc để triển khai dễ dàng hơn và tiết kiệm pin để không phải tất cả yêu cầu đều được chuyển tới NetworkFactory . Tuy nhiên, nếu việc triển khai tùy chỉnh của bạn yêu cầu tất cả yêu cầu phải được chuyển đến NetworkFactory thì 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 qua bộ lọc điểm 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.

Thẩm định

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

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ề ứng dụng để phản hồi việc chúng 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 tới ứng dụng khi chúng 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 tiêu hao pin nghiêm trọng do tác nhân mạng bị đưa ra điểm không cho phép nó đủ điều kiện cho bất kỳ yêu cầu nào và bị phá bỏ ngay sau đó. Nếu tác nhân được đưa lên và tháo xuống nhiều lần, điều này có thể tiêu tốn rất nhiều pin.