内核概览

基于应用/委托的流量使用情况监控和跟踪功能依赖于 android-3.0 Linux 内核中的 xt_qtaguid 模块 (kernel/net/netfilter/xt_qtaguid)。框架中的套接字标记功能 (system/core/libcutils/qtaguid.c) 主要依赖于存在由 xt_qtaguid 内核模块导出的 /proc/net/xt_qtaguid/ctrl 接口。

quota2 netfilter 模块(最初属于 xtables-addons)支持设置指定的配额限制;此外,经过扩展后,该模块还支持在达到特定配额限制时通知用户空间。一旦达到配额限制,quota2 模块就会舍弃所有后续网络流量。框架还可以指定额外的规则来限制应用的后台数据流量(请参阅 com.android.server.NetworkManagementSocketTagger.setKernelCounterSetandroid.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND)。

工作原理

qtaguid netfilter 模块使用拥有网络流量的应用的专属 UID,按套接字对每个应用的网络流量进行跟踪。系统中有两个与所有套接字相关联的标记组件。第一个是 UID,用来唯一标识负责数据传输的应用(Linux 允许将每个网络套接字的所有权归于发起调用的应用的 UID)。第二个标记组件用于支持在应用开发者指定的类别中对流量进行额外的特性描述。借助这些应用级标记,应用可以将流量归类到若干子类别。

如果应用以服务的形式(如内容下载管理器、媒体流式传输服务等)提供网络数据传输,可通过调用 TrafficStats.setThreadStatsUid() 函数将网络数据传输的所有权归于发出请求的应用的 UID。调用方必须具备“android.permission.MODIFY_NETWORK_ACCOUNTING”权限才能重新分配网络流量的所有权。