2017-01-21 3 views
0

Я разрабатываю приложение для Android, которое должно отображать статистику использования сети приложений. Я использую TrafficStats APIs на устройствах под управлением Android версий до 6 и NetworkStatsManager APIs на устройствах под управлением Android 6 и новее.Странные результаты TrafficStats/NetworkStatsManager APIs

Приложение, отображающее список приложений, отсортированных по сети в байтах.

Я заметил, что всегда есть несколько системных приложений, которые имеют точно такое же значение использования сети (например, если у одного есть 31317179 rx байт, тогда у другого будет точно такой же 31317179). Их Pakage имен:

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

, но может варьироваться в зависимости от версии устройства/os. Мой вопрос, почему это происходит? Это ошибка в 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

Они могут использовать 'android: sharedUserId' и иметь одинаковые' uid'. – CommonsWare

+0

Спасибо! Я проверил, и это правильный ответ. У них действительно такой же uid. –

ответ

0

TrafficStats отчеты о трафике по UID. Для большинства приложений в одном UID есть одно приложение. Для приложений Googly и системных приложений, предоставляемых разработчиком/изготовителем ПК, может быть несколько приложений на каждый UID, любезно предоставленный android:sharedUserId. Я не знаю, как различать трафик по пакету в UID. Но код в вашем вопросе приведет к N записям с тем же трафиком для N приложений, когда эти N-приложения имеют одинаковый UID.

Смежные вопросы