网络接口统计信息概览

在 Android 4.0 中,Linux 网络接口所报告的统计信息会不时进行记录,并用于强制执行网络配额限制、呈现用户可见的图表等操作。

每个网络设备驱动程序(包括 WLAN)都必须遵循标准的内核设备生命周期,并通过 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 表示,以便正确计算统计信息。