网络接口统计信息概览

在 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_bytestx_bytes 值是否准确返回传输的互联网层 (IP) 字节数。我们也知道,对其他设备而言可能并非如此。现在,该功能依赖于这一特性。新的驱动程序也应该具有该属性,且 dev_get_stats() 值不得包含较低网络层(如以太网标头)的任何封装开销,且最好不包含其他流量(如 ARP),除非可以忽略不计。

Android 框架仅从与 ConnectivityService 中的 NetworkStateTracker 关联的网络接口收集统计信息。这样一来,框架就可以具体识别每个网络接口,包括其类型(如 TYPE_MOBILETYPE_WIFI)以及订阅者身份(如 IMSI)。用于路由数据的所有网络接口都应由 NetworkStateTracker 表示,以便正确计算统计信息。