我在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的总和。
答案 0 :(得分:2)
当您使用TrafficStats.getUidRxBytes或TrafficStats.getUidTxBytes时,它只计算UID发送的有效负载,但不计算标头的大小,因此所有UID的总和与getTotalRxBytes()之间会有很小的差异或getTotalTxBytes。流媒体服务,Voip或一些大型文件上传的差异似乎更大。