网络接口统计信息概览

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

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