TrafficStats / NetworkStatsManager API的奇怪结果

时间:2017-01-21 21:52:35

标签: android network-programming

我正在开发应根据应用程序网络使用情况统计信息显示的Android应用。我在运行Android 6及更新版本的设备上运行Android版本6和TrafficStats APIs的设备上使用NetworkStatsManager APIs

我的应用程序显示按网络使用情况排序的应用列表,以字节为单位。

我注意到总有几个系统应用具有完全相同的网络使用价值(例如,如果一个具有31317179 rx字节,那么其他将具有完全相同的31317179)。他们的名字是:

  • com.google.android.syncadapters.contacts
  • com.google.android.gms
  • com.google.android.gsf
  • com.google.android.gsf.login

但可能因设备/操作系统版本而异。 我的问题是为什么会这样?这是API中的错误吗?如果这些应用程序以某种方式共享相同的流量 - 有没有办法获取有关哪些进程共享流量以便将其分组的信息?

我目前的TrafficStats代码是这样的:

private List<TrafficInfo> getTrafficInfosByTrafficStatsAPI(PackageManager pm) {
    List<TrafficInfo> trafficlnfos = new ArrayList<>();
    List<PackageInfo> packinfos = pm.getInstalledPackages(PackageManager.GET_PERMISSIONS);
    for (PackageInfo info : packinfos) {
        String[] premissions = info.requestedPermissions;
        if (premissions != null && premissions.length > 0) {
            for (String premission : premissions) {
                if ("android.permission.INTERNET".equals(premission)) {
                    int uid = info.applicationInfo.uid;
                    long total = TrafficStats.getUidRxBytes(uid) + TrafficStats.getUidTxBytes(uid);
                    if (total > 0) {
                        TrafficInfo trafficInfo = new TrafficInfo();
                        trafficInfo.setName(getPackageName(pm, info));
                        trafficInfo.setPackageName(info.packageName);
                        trafficInfo.setTraffic(total);
                        trafficlnfos.add(trafficInfo);
                    }
                }
            }
        }
    }

    Collections.sort(trafficlnfos);
    return trafficlnfos;
}

1 个答案:

答案 0 :(得分:0)

TrafficStats按UID报告流量。对于大多数应用,每个UID只有一个应用。对于Googly应用程序以及设备制造商/自定义ROM开发人员提供的系统应用程序,每个UID可能有多个应用程序,由android:sharedUserId提供。我不知道有任何方法可以在UID中区分包的流量。但是,当这些N个应用具有相同的UID时,您问题中的代码将导致N个记录具有相同的N个应用流量。