Функциональность мониторинга и отслеживания использования данных на уровне отдельных приложений и делегированных данных основана на модуле xt_qtaguid в ядре Linux Android 3.0 ( kernel/net/netfilter/xt_qtaguid ). Функциональность тегирования сокетов в фреймворке ( system/core/libcutils/qtaguid.c ) основана главным образом на наличии интерфейса /proc/net/xt_qtaguid/ctrl экспортируемого модулем ядра xt_qtaguid .
Модуль quota2 netfilter (первоначально входивший в состав xtables-addons ) позволяет устанавливать именованные квоты и был расширен для поддержки уведомлений пользовательского пространства о достижении определённых лимитов. После достижения квоты модуль quota2 отбрасывает весь последующий сетевой трафик. Фреймворк также может задавать дополнительные правила для ограничения фонового трафика данных для приложения (см. com.android.server.NetworkManagementSocketTagger.setKernelCounterSet и android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND ).
Как это работает?
Модуль qtaguid netfilter отслеживает сетевой трафик для каждого сокета отдельно для каждого приложения, используя уникальный UID приложения-владельца. С каждым сокетом в системе связаны два компонента тега. Первый — это UID, который однозначно идентифицирует приложение, ответственное за передачу данных (Linux позволяет связать владельца каждого сетевого сокета с UID вызывающего приложения). Второй компонент тега используется для дополнительной классификации трафика по категориям, указанным разработчиком приложения. Используя эти теги уровня приложения, приложение может профилировать трафик по нескольким подкатегориям.
В случае приложений, предоставляющих сетевую передачу данных как услугу, таких как менеджер загрузок, сервис потоковой передачи мультимедиа и т. д., можно присвоить право собственности на передачу сетевых данных UID запрашивающего приложения с помощью вызова функции TrafficStats.setThreadStatsUid() . Вызывающий объект должен иметь разрешение « android.permission.MODIFY_NETWORK_ACCOUNTING » для переназначения права собственности на сетевой трафик.