Trong Android 4.0, các số liệu thống kê do giao diện mạng Linux báo cáo được ghi lại theo thời gian và được sử dụng để thực thi giới hạn hạn ngạch mạng, hiển thị biểu đồ người dùng có thể nhìn thấy, v.v.
Mỗi trình điều khiển thiết bị mạng (bao gồm Wi-Fi) phải tuân theo vòng đời thiết bị hạt nhân tiêu chuẩn và trả về số liệu thống kê chính xác thông qua dev_get_stats()
. Đặc biệt, số liệu thống kê trả về phải duy trì tính đơn điệu nghiêm ngặt trong khi giao diện đang hoạt động. Trình điều khiển chỉ có thể đặt lại thống kê sau khi hoàn tất thành công unregister_netdev()
hoặc tương đương tạo sự kiện NETDEV_UNREGISTER
cho các lệnh gọi lại được đăng ký với register_netdevice_notifier()
/ register_inetaddr_notifier()
/ register_inet6addr_notifier()
.
Các nhà khai thác di động thường đo lường mức sử dụng dữ liệu ở lớp Internet (IP). Để phù hợp với cách tiếp cận này trong Android 4.0, chúng tôi dựa trên thực tế là đối với các thiết bị hạt nhân, chúng tôi quan tâm đến các giá trị rx_bytes
và tx_bytes
do dev_get_stats()
trả về chính xác byte lớp Internet ( IP
) được truyền. Nhưng chúng tôi hiểu rằng đối với các thiết bị khác có thể không đúng như vậy. Hiện tại, tính năng này dựa vào tính đặc thù này. Các trình điều khiển mới cũng phải có thuộc tính đó và các giá trị dev_get_stats()
không được bao gồm bất kỳ chi phí đóng gói nào của các lớp mạng thấp hơn (chẳng hạn như tiêu đề Ethernet) và tốt hơn là không bao gồm lưu lượng khác (chẳng hạn như ARP) trừ khi nó không đáng kể.
Khung công tác Android chỉ thu thập số liệu thống kê từ các giao diện mạng được liên kết với NetworkStateTracker
trong ConnectivityService
. Điều này cho phép khuôn khổ xác định cụ thể từng giao diện mạng, bao gồm loại của nó (chẳng hạn như TYPE_MOBILE
hoặc TYPE_WIFI
) và danh tính thuê bao (chẳng hạn như IMSI). Tất cả các giao diện mạng được sử dụng để định tuyến dữ liệu phải được đại diện bởi NetworkStateTracker
để thống kê có thể được tính toán chính xác.