在 Android 4.0 中,Linux 网络接口报告的统计数据会随着时间的推移进行记录,并用于强制实施网络配额限制、呈现用户可见的图表等。
每个网络设备驱动程序(包括 Wi-Fi)都必须遵循标准内核设备生命周期,并通过dev_get_stats()
返回正确的统计信息。特别是,当接口处于活动状态时,返回的统计信息必须保持严格单调。驱动程序只能在成功完成unregister_netdev()
或为使用register_netdevice_notifier()
/ register_inetaddr_notifier()
/ register_inet6addr_notifier()
注册的回调生成NETDEV_UNREGISTER
事件的等效项后重置统计信息。
移动运营商通常在互联网层 (IP) 测量数据使用情况。为了与 Android 4.0 中的这种方法相匹配,我们依赖于这样一个事实,即对于内核设备,我们关心dev_get_stats()
返回的rx_bytes
和tx_bytes
值准确地返回传输的 Internet 层 ( IP
) 字节。但我们知道,对于其他设备,情况可能并非如此。目前,该功能依赖于这种特性。新驱动程序也应该具有该属性,并且dev_get_stats()
值不得包括较低网络层的任何封装开销(例如以太网标头),并且最好不包括其他流量(例如 ARP),除非它可以忽略不计。
Android 框架仅从与ConnectivityService
中的NetworkStateTracker
关联的网络接口收集统计信息。这使框架能够具体识别每个网络接口,包括其类型(例如TYPE_MOBILE
或TYPE_WIFI
)和订户身份(例如 IMSI)。用于路由数据的所有网络接口都应由NetworkStateTracker
表示,以便可以正确计算统计信息。