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

时间:2013-07-27 06:30:46

标签: android

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

可能会或可能不会影响此事的一些事情:

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

2.。)随着Android API 18的更新,流量统计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,但报告正确统计

3 个答案:

答案 0 :(得分:5)

我已向AOSP问题跟踪器报告此问题:here

我还为下面粘贴的问题创建了另一种解决方案:

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();

}

答案 1 :(得分: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

答案 2 :(得分:2)

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

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

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

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

*改进TrafficStats UID API。 弃用传输层统计信息,仅保留汇总 网络层统计。 改进文档以清楚测量的层 发生,以及自引导以来的行为。在引擎盖下,转向使用 xt_qtaguid UID统计信息。 错误:6818637,7013662 更改ID:I9f26992e5fcdebd88c671e5765bd91229e7b0016 *