В 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, мы полагаемся на тот факт, что для устройств ядра мы заботимся о значениях rx_bytes
и tx_bytes
, возвращаемых dev_get_stats()
, которые возвращают точно переданные байты интернет-уровня ( IP
). Но мы понимаем, что для других устройств это может быть не так. На данный момент функция опирается на эту особенность. Новые драйверы также должны иметь это свойство, а значения dev_get_stats()
не должны включать какие-либо накладные расходы на инкапсуляцию нижних сетевых уровней (например, заголовки Ethernet) и предпочтительно не должны включать другой трафик (например, ARP), если он не является незначительным.
Платформа Android собирает статистику только с сетевых интерфейсов, связанных с NetworkStateTracker
в ConnectivityService
. Это позволяет платформе точно идентифицировать каждый сетевой интерфейс, включая его тип (например, TYPE_MOBILE
или TYPE_WIFI
) и идентификатор абонента (например, IMSI). Все сетевые интерфейсы, используемые для маршрутизации данных, должны быть представлены NetworkStateTracker
, чтобы можно было правильно учитывать статистику.