9

我觉得我现在正在服用疯狂的药丸。我的应用程序的特定部分已经运行了好几天,今天它刚刚停止工作,我不知道为什么。我的这部分代码用于输出自启动以来每个特定应用程序发送和接收的总数据。现在,这些值始终显示为 0。

可能会或可能不会影响这一点的几件事:

1.) 我的 Nexus 4 今天刚刚更新到 Android 4.3,但我怀疑这是一个问题,因为在我更新后它工作得很好。

2.) 随着 Android API 18 的更新,Traffic Stats API 中的一些方法现在已被弃用,但这些方法我什至没有使用,所以这应该没有效果。 http://developer.android.com/reference/android/net/TrafficStats.html

非常感谢所有帮助。

PackageManager packageManager=this.getPackageManager();
List<ApplicationInfo> appList=packageManager.getInstalledApplications(0);

for (ApplicationInfo appInfo : appList) {
    String appLabel = (String) packageManager.getApplicationLabel(appInfo);
    int uid = appInfo.uid;
    Log.d("data", String.valueOf(TrafficStats.getUidRxBytes(uid) + TrafficStats.getUidTxBytes(uid)));

更新[2014 年 1 月 23 日]:在运行 Android 4.4.2 的 Nexus 4 上测试 getUidRxBytes() 和 getUidTxBytes() 显示值不再为 0,但报告的统计数据正确。

4

3 回答 3

6

我已将问题报告给 AOSP 问题跟踪器:这里

我还为下面粘贴的问题创建了一个替代解决方案:

private Long getTotalBytesManual(int localUid){

File dir = new File("/proc/uid_stat/");
String[] children = dir.list();
if(!Arrays.asList(children).contains(String.valueOf(localUid))){
    return 0L;
}
File uidFileDir = new File("/proc/uid_stat/"+String.valueOf(localUid));
File uidActualFileReceived = new File(uidFileDir,"tcp_rcv");
File uidActualFileSent = new File(uidFileDir,"tcp_snd");

 String textReceived = "0";
 String textSent = "0";

 try {
        BufferedReader brReceived = new BufferedReader(new FileReader(uidActualFileReceived));
        BufferedReader brSent = new BufferedReader(new FileReader(uidActualFileSent));
        String receivedLine;
        String sentLine;

        if ((receivedLine = brReceived.readLine()) != null) {
            textReceived = receivedLine;
        }
        if ((sentLine = brSent.readLine()) != null) {
            textSent = sentLine;
        }

    }
    catch (IOException e) {

    }
 return Long.valueOf(textReceived).longValue() + Long.valueOf(textReceived).longValue();

}
于 2013-08-03T02:22:05.063 回答
3

TrafficStats 类从目录中获取有关网络流量的信息/proc/uid_stat/<uid>。这包含有关发送和接收的 tcp、udp 字节和数据包的信息。如果文件不存在,则 TrafficStats 类无法获取网络统计信息。您可以检查文件是否存在,如果不存在,则您不走运,应该寻找其他方式。

如果文件存在,您可以尝试自己阅读。

此外,getUidTxBytes() 和 getUIDRxBytes() 仅报告 TCP 流量并错过 UDP 流量。因此,如果您的应用程序正在处理大量 UDP 流量(如 voip),那么您将不会获得任何信息。已经为此提交了一个错误:https ://code.google.com/p/android/issues/detail?id=32410

于 2013-07-30T06:37:05.620 回答
2

我已经对此进行了一些详细的研究,并澄清了一些细节,因为从 Android 4.3 开始,TrafficStats API 改变了它从设备中提取细节的方式。

在 Android 4.3 之前,UID 流量统计信息可用于 TCP 和 UDP,并包括用于字节和数据包以及发送和接收的 API。该数据是从 /proc/uid_stat/[pid]/* 文件中提取的。

在 Android 4.3 中,开发人员决定切换到更好、更安全的 API,使用 xt_qtaguid UID 统计信息,它是 Linux 中 netfilter 内核模块的一部分。此 API (procfs) 允许基于进程 UID 进行访问,这就是为什么当您尝试在 Android=>4.3 中访问 TrafficStats API 时,您将获得非自己 UID 的零信息。

顺便说一句,导致问题的提交如下: https://github.com/android/platform_frameworks_base/commit/92be93a94edafb5906e8bc48e6fee9dd07f5049e

*改进 TrafficStats UID API。弃用传输层统计信息,仅保留汇总的网络层统计信息。改进文档以明确测量发生的层以及它们自启动以来的行为。在后台,转而使用 xt_qtaguid UID 统计信息。错误:6818637、7013662 更改 ID:I9f26992e5fcdebd88c671e5765bd91229e7b0016*

于 2013-10-27T00:58:57.570 回答