在Android 4.3中,getUidRxBytes()和getUidTxBytes()始终返回0

在Android 4.3中,getUidRxBytes()和getUidTxBytes()始终返回0,android,Android,我觉得我现在正在服用疯狂的药丸。我的应用程序的一个特定部分已经正常工作了好几天,今天它停止工作了,我不知道为什么。这部分代码用于输出每个特定应用程序自启动以来发送和接收的总数据。现在,值始终显示为0 可能影响或不影响这一点的两件事: 1.)我的Nexus4今天刚刚更新到Android 4.3,但我怀疑这是否是一个问题,因为在我更新之后,它工作得很好 2.)随着Android API 18的更新,来自Traffic Stats API的一些方法现在已经被弃用,但这些方法我甚至没有使用,因此这应该没

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

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

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

2.)随着Android API 18的更新,来自Traffic Stats API的一些方法现在已经被弃用,但这些方法我甚至没有使用,因此这应该没有任何效果。

非常感谢您的帮助

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)));
PackageManager-PackageManager=this.getPackageManager();
List appList=packageManager.GetInstalledApplication(0);
for(ApplicationInfo-appInfo:appList){
字符串appLabel=(字符串)packageManager.getApplicationLabel(appInfo);
int uid=appInfo.uid;
Log.d(“数据”,String.valueOf(TrafficStats.getUidRxBytes(uid)+TrafficStats.getUidTxBytes(uid));

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

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

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

此外,getUidTxBytes()和getUIDRxBytes()只报告TCP流量和未命中UDP流量。因此,如果你的应用程序正在进行大量UDP流量(如voip),那么你将无法获得任何信息。
此问题已经存在一个bug:

我已向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();

}

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

在安卓4.3之前,UID流量统计数据可用于TCP和UDP,并包括字节和数据包的API&发送和接收。这些数据是从/proc/UID_stat/[pid]/*文件中提取的

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

顺便说一句,导致问题的提交如下:

*改进流量统计UID API。 弃用传输层统计信息,只保留摘要 网络层统计。 改进文档,以明确需要测量的图层 发生,以及他们自开机以来的行为。在引擎盖下,移动到使用 xt_qtaguid UID统计信息。 错误:68186377013662
变更Id:I9f26992e5fcdebd88c671e5765bd91229e7b0016*

尽管您反对,但我认为您提到的两件事可能是最有可能的原因。我感谢Robert的回复,但正如我所说,我不认为这些可能是问题,因为在我更新到4.3之后,一切都正常了。它开始报告时是几个小时后的事出于某种原因0。要将nexus闪存回4.2以查看其是否有效,brbaah地狱不。上述代码在Android 4.2.2上运行时效果完美。但在Android 4.3上,它报告所有应用程序自启动以来已传输了0字节。考虑到上述代码中使用的任何方法都未被弃用,因此我感到不安更新:我已经在AOSP问题跟踪器上报告了这一点。我将在了解更多信息后进行更新:文件确实存在于您指定的目录中。每个uid都有一个以自身命名的文件夹,例如10033。每个文件夹中有两个文本文件es,一个名为“tcp_rcv”,另一个名为“tcp_snd”,每个都包含一个数字。这些数字不是0,因此getUidRxBytes()和getUidTxBytes()应该返回正确的值。感谢您的帮助。是否有关于6.0.x的修复程序或其他方法的信息?谢谢您编写了“textReceived”在最后一行代码中两次。另外,您没有关闭读卡器,而是使用“String.valueOf”(和两次)而不是调用“Long.toString”我还有一个问题:官方文档说它从上次启动后就获得了数据,但似乎这个方法在操作系统当前会话之前获取了整数eevn。怎么可能呢?我检查了问题状态并测试了你的代码,似乎出于安全原因,他们不想让任何人知道哪个应用程序正在使用互联网,因此,
uid\u stat
目录为空,甚至您的代码也无法工作(或者可能需要设备根目录)。因此,官方框架对除当前应用程序之外的所有应用程序返回0?为什么认为它更安全?它们只是统计数字,甚至可以通过操作系统的设置使用。此外,将从“/proc/uid_stat”读取仍然有效并返回正确的结果?有些人声称整个问题在Android 4.4上得到了修复,但我看不出它得到了修复(所有应用程序返回0)。