监控 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 或一些大文件上传,差异似乎更大。
我在 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 或一些大文件上传,差异似乎更大。