2017-01-21 13 views
0

アプリケーションネットワークの使用状況の統計情報を表示するAndroidアプリを開発しました。 Android 6以降を搭載する端末では、TrafficStats APIsをAndroidバージョン6より前の端末で、NetworkStatsManager APIsからAndroid 6以降を搭載する端末で使用しています。TrafficStats/NetworkStatsManager APIの奇妙な結果

アプリのリストを表示するアプリは、ネットワークの使用状況でバイト単位でソートされています。

ネットワークの使用量がまったく同じ値を持つ複数のシステムアプリが常に存在することに気づきました(たとえば、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ごとに1つのアプリがあります。 Googlyアプリ、デバイスメーカー/カスタムROM開発者が提供するシステムアプリの場合、UIDごとにいくつかのアプリがあります(android:sharedUserId)。私は、UID内のパッケージごとにトラフィックを区別する方法を認識していません。しかし、N個のアプリが同じUIDを持つ場合、あなたの質問のコードは、N個のアプリのトラフィックが同じN個のレコードになります。