9

ネットワークインターフェイスと特定のアプリケーション(pex Chrome)のトラフィックを測定するために、新しいNetworkStatsクラスを比較していますTrafficStats

デバイスの起動以降TrafficStatsの値があるため、実行しているテストは次のとおりです。

  1. 電話を再起動します。
  2. クロムを開きます。
  3. 10 MB のデータをダウンロード (WiFi 経由)。

で取得したデータTrafficStatsは次のとおりです。

TrafficStats.getTotalRxBytes() aprox 17.21 MB
TrafficStats.getUidRxBytes(chromeUid) aprox 13.22 MB

私はアクセス許可を付与し、NetworkStats取得した値は次のとおりです。

wifiBucket.getRxBytes() + mobileBucket.getRxBytes() aprox 17.23 MB
dataFromWiFiBucket[1] + dataFromMobileBucket[1] gives 0 bytes

データを取得するコードNetworkStatsは次のとおりです。

long timeStamp = System.currentTimeMillis();
long bootTime = System.currentTimeMillis() - SystemClock.elapsedRealtime();

NetworkStats.Bucket wifiBucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI, null, bootTime, timeStamp);
NetworkStats.Bucket mobileBucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE, subscriberID, bootTime, timeStamp);

NetworkStats wifiBucketForApp = networkStatsManager.queryDetailsForUid(ConnectivityManager.TYPE_WIFI, null, bootTime, timeStamp, chromeUid);
NetworkStats mobileBucketForApp = networkStatsManager.queryDetailsForUid(ConnectivityManager.TYPE_MOBILE, subscriberID, bootTime, timeStamp, chromeUid);

long[] dataFromWiFiBucket = getDataFromBucket(wifiBucketForApp);
long[] dataFromMobileBucket = getDataFromBucket(mobileBucketForApp);

どこgetDataFromBucketにある:

@RequiresApi(api = Build.VERSION_CODES.M) public static long[] getDataFromBucket(NetworkStats bucketForApp) {

    long dataTx = 0;
    long dataRx = 0;

    NetworkStats.Bucket bucket;

    while (bucketForApp.hasNextBucket()) {
        bucket = new NetworkStats.Bucket();
        bucketForApp.getNextBucket(bucket);
        dataTx += bucket.getTxBytes();
        dataRx += bucket.getRxBytes();

    }

    return new long[]{dataTx, dataRx};
}

バケットは 2 時間からあるとどこかで読んだので、次のコードを追加しました。

if (bootTime > (timeStamp - TimeUnit.HOURS.toMillis(TWO_HOURS))) {
    bootTime = timeStamp - TimeUnit.HOURS.toMillis(TWO_HOURS);
}

しかし、 とにはバケットがないためwifiBucketForApp、 chrome のデータはまだ 0 です。mobileBucketForApp

bootTime1日の始まり (私の国では 18:30) に設定すると、次のようになります。

wifiBucket.getRxBytes() + mobileBucket.getRxBytes() aprox 44.74 MB (expected because is since the beginning of the day)
dataFromWiFiBucket[1] + dataFromMobileBucket[1] gives 26.32 MB

Chrome アプリTrafficStatsからデバイスを起動して以来、同じ値を取得していない理由を知っている人はいますか?NetworkStatsManager

4

1 に答える 1