Android 如何跟踪每个应用程序的数据使用情况?

How does Android tracks data usage per application?

Android 可以跟踪 from/to 应用程序发送和接收的字节数。
我想知道这些数据是如何统计的。例如,当我 运行 本机应用程序打开 TCP 套接字,发送和接收数据时,该数据被计算在内。
我知道它与 xt_qtaguid 模块有关,该模块标记套接字每个 UID。

快速搜索:

快速浏览 packages/apps/Settings (http://androidxref.com/5.1.1_r6/xref/packages/apps/Settings/src/com/android/settings/DataUsageSummary.java#296) 似乎它依赖于

网络统计服务: http://androidxref.com/5.1.1_r6/xref/frameworks/base/services/core/java/com/android/server/net/NetworkStatsService.java#906

这似乎归结为阅读:

mStatsXtIfaceAll = new File(procRoot, "net/xt_qtaguid/iface_stat_all");
mStatsXtIfaceFmt = new File(procRoot, "net/xt_qtaguid/iface_stat_fmt");
mStatsXtUid = new File(procRoot, "net/xt_qtaguid/stats");

"net/xt_qtaguid/stats" 似乎包含有关应用级别的信息。

-- 这里略过几步,但是这个文件只打开阅读后,它是由xt_qtaguid内核模块写入的。

代码: https://android.googlesource.com/kernel/common/+/f0cfc3cc16a15c41107e83f49b61fe2e5a5303be/net/netfilter/xt_qtaguid.c

内核不是我的专长,我们现在不属于系统的 "Android" 部分,也许这个问题属于 Linux 内核问题而不是 Android题? :)