基于应用/委托的流量使用情况监控和跟踪功能依赖于 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.setKernelCounterSet
和 android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND
)。
工作原理
qtaguid
netfilter 模块使用应用的专属 UID,按套接字对每个应用的网络流量进行跟踪。系统中有两个标记组件与套接字相关联。第一个是 UID,用来明确标识进行数据传输的应用(Linux 允许将每个网络套接字的所有权与调用应用的 UID 相关联)。第二个标记组件用于支持附加于流量上的开发者指定的类别描述。应用可使用这些应用级标记,将流量归类到若干子类别。
当应用以服务(如下载管理器、媒体流式传输服务等)的方式传输网络数据时,可通过调用 TrafficStats.setThreadStatsUid()
函数将传输作业的所有权与发出请求的应用的 UID 相关联。调用程序必须具备“android.permission.MODIFY_NETWORK_ACCOUNTING
”权限才能重新分配网络流量的所有权。