在 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
值是否准确返回传输的互联网层 (IP
) 字节数。我们也知道,对其他设备而言可能并非如此。现在,该功能依赖于这一特性。新的驱动程序也应该具有该属性,且 dev_get_stats()
值不得包含较低网络层(如以太网标头)的任何封装开销,且最好不包含其他流量(如 ARP),除非可以忽略不计。
Android 框架仅从与 ConnectivityService
中的 NetworkStateTracker
关联的网络接口收集统计信息。这样一来,框架就可以具体识别每个网络接口,包括其类型(如 TYPE_MOBILE
或 TYPE_WIFI
)以及订阅者身份(如 IMSI)。用于路由数据的所有网络接口都应由 NetworkStateTracker
表示,以便正确计算统计信息。