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