概览

基于应用/授权数据使用情况的监控和跟踪功能依赖于 Android 3.0 的 Linux 内核 (kernel/net/netfilter/xt_qtaguid) 中的 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”权限才能重新分配网络流量的所有权。