Обзор

Функциональность мониторинга и отслеживания использования каждого приложения/делегированных данных опирается на модуль xt_qtaguid в ядре Linux android-3.0 ( kernel/net/netfilter/xt_qtaguid ). Функциональность тегирования сокетов в платформе ( system/core/libcutils/qtaguid.c ) в основном зависит от существования интерфейса /proc/net/xt_qtaguid/ctrl экспортируемого модулем ядра xt_qtaguid .

Модуль netfilter quota2 (первоначально входивший в состав xtables-addons ) позволяет устанавливать именованные ограничения квот и был расширен для поддержки уведомления пользовательского пространства при достижении определенных ограничений. Как только предел квоты достигнут, модуль quota2 отбрасывает весь последующий сетевой трафик. Платформа также может указывать дополнительные правила для ограничения фонового трафика данных для приложения (см. com.android.server.NetworkManagementSocketTagger.setKernelCounterSet и android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND ).

Как это работает?

Модуль qtaguid netfilter отслеживает сетевой трафик для каждого сокета для каждого приложения, используя уникальный UID приложения-владельца. С любым сокетом в системе связаны два компонента тегов. Первый — это UID, который однозначно идентифицирует приложение, отвечающее за передачу данных (Linux позволяет приписать право собственности на каждый сетевой сокет UID вызывающего приложения). Второй компонент тега используется для поддержки дополнительной классификации трафика по категориям, указанным разработчиком приложения. Используя эти теги уровня приложения, приложение может распределять трафик по нескольким подкатегориям.

В случае приложений, которые обеспечивают передачу сетевых данных как услуги, таких как менеджер загрузок, служба потоковой передачи мультимедиа и т. д., можно приписать право собственности на передачу сетевых данных UID запрашивающего приложения с помощью TrafficStats.setThreadStatsUid() . TrafficStats.setThreadStatsUid() вызов функции. Вызывающий объект должен иметь разрешение « android.permission.MODIFY_NETWORK_ACCOUNTING », чтобы переназначить владельца сетевого трафика.