监控 Android 中的数据使用情况:总统计数据与每个 UID 统计数据之间的差异

Monitoring data usage in Android: difference between total stats and per UID stats

我在 Android 中遇到了一些数据流量监视器的问题。我必须获取每个 UID 传输的字节数和每个 UID 接收的字节数以及所有 UID 的总和(也分为传输和接收)。问题是所有 UID 的单个值的总和不同于我通过调用 TrafficStats.getTotalRxBytes() 和 TrafficStats.getTotalTxBytes() 获得的值(这些是所有 UID 的总传输和接收值)。通常,总值大于所有 UID 的总和(例如,105MB 对接收值 95MB)。

我将从 TrafficStats.getTotalRxBytes() 检索到的值与为每个 UID 调用的 TrafficStats.getUidRxBytes(uid) 的总和进行比较。传输值也是如此。

这是我用来获取 UID 列表的代码片段:

File dir = new File("/proc/uid_stat/");
String[] children = dir.list();
List<Integer> uids = new ArrayList<>();
if (children != null) {
    for (int i = 0; i < children.length; i++) {
        int uid = Integer.parseInt(children[i]);
        if ((uid >= 0 && uid <= 2000) || (uid >= 10000)) {
            uids.add(uid);
        }
    }
}

我也尝试过不带条件 ((uid >= 0 && uid <= 2000) || (uid >= 10000)),仅检查 uid 是否 >= 0,但在我的情况下是一样的。

我注意到的一些事情:如果我通过 whatsapp 发送 6MB 视频,下次我执行读取时,whatsapp 的 TX 值不会增加该数量。它只会增加几个字节(例如 4500)。我寻找另一个已增加大约 6MB 的应用程序,例如 MEDIA,但没有任何应用程序。不知道是whatsapp压缩了视频还是什么。

我已经阅读了一些错误,例如 Android 2.3 或更早版本中 UID 文件 (/proc/uid_stat/[uid]/) 中的重复值,但我正在真实设备中测试该应用程序与 4.1.2。

我几乎遵循了 this 博客中描述的步骤。

我想知道这种差异是正常的还是我的代码有问题。我读到正确的值是总数,而不是 UID 的总和。

当您使用 TrafficStats.getUidRxBytes 或 TrafficStats.getUidTxBytes 时,它只计算 UID 发送的有效载荷,而不计算 headers 的大小,因此总和之间会有很小的差异所有 UID 和 getTotalRxBytes() 或 getTotalTxBytes。对于流媒体服务、Voip 或一些大文件上传,差异似乎更大。