我正在开发应根据应用程序网络使用情况统计信息显示的Android应用。我在运行Android 6及更新版本的设备上运行Android版本6和TrafficStats APIs的设备上使用NetworkStatsManager APIs。
我的应用程序显示按网络使用情况排序的应用列表,以字节为单位。
我注意到总有几个系统应用具有完全相同的网络使用价值(例如,如果一个具有31317179 rx字节,那么其他将具有完全相同的31317179)。他们的名字是:
但可能因设备/操作系统版本而异。 我的问题是为什么会这样?这是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;
}
答案 0 :(得分:0)
TrafficStats
按UID报告流量。对于大多数应用,每个UID只有一个应用。对于Googly应用程序以及设备制造商/自定义ROM开发人员提供的系统应用程序,每个UID可能有多个应用程序,由android:sharedUserId
提供。我不知道有任何方法可以在UID中区分包的流量。但是,当这些N个应用具有相同的UID时,您问题中的代码将导致N个记录具有相同的N个应用流量。