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

时间:2015-11-10 16:37:11

标签: android uid

我在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&gt; = 0&amp;&amp; uid&lt; = 2000)||(uid&gt; = 10000)),只检查uid是&gt; = 0,但在我的情况就是这样。

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

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

我已经完成了this博客中描述的几个步骤。

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

1 个答案:

答案 0 :(得分:2)

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