Обзор ядра

Функциональность мониторинга и отслеживания использования данных для каждого приложения и делегированных задач основана на модуле 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 ».