Обзор ядра

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

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

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

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