9

私は今、クレイジーな薬を飲んでいるような気がします。アプリケーションの特定の部分が数日間正常に動作していましたが、今日は動作を停止し、その理由がわかりません。私のコードのこの部分は、特定の各アプリが送受信したブート以降の合計データを出力するために使用されていました。現在、値は常に 0 として表示されます。

これに影響を与える可能性がある、または影響しない可能性のあるいくつかの事柄:

1.) 私の Nexus 4 は、今日 Android 4.3 に更新されたばかりですが、更新直後に問題なく動作したため、これが問題であるとは思えません。

2.) Android API 18 の更新により、Traffic Stats API の一部のメソッドが非推奨になりましたが、これらは私が使用していないメソッドであるため、影響はありません。 http://developer.android.com/reference/android/net/TrafficStats.html

すべてのヘルプは大歓迎です。

PackageManager packageManager=this.getPackageManager();
List<ApplicationInfo> appList=packageManager.getInstalledApplications(0);

for (ApplicationInfo appInfo : appList) {
    String appLabel = (String) packageManager.getApplicationLabel(appInfo);
    int uid = appInfo.uid;
    Log.d("data", String.valueOf(TrafficStats.getUidRxBytes(uid) + TrafficStats.getUidTxBytes(uid)));

更新 [2014 年 1 月 23 日]: Android 4.4.2 を実行している Nexus 4 で getUidRxBytes() と getUidTxBytes() をテストすると、値が 0 ではなくなりましたが、正しい統計が報告されています。

4

3 に答える 3

6

この問題を AOSP イシュー トラッカーに報告しました:こちら

以下に貼り付けた問題の代替ソリューションも作成しました。

private Long getTotalBytesManual(int localUid){

File dir = new File("/proc/uid_stat/");
String[] children = dir.list();
if(!Arrays.asList(children).contains(String.valueOf(localUid))){
    return 0L;
}
File uidFileDir = new File("/proc/uid_stat/"+String.valueOf(localUid));
File uidActualFileReceived = new File(uidFileDir,"tcp_rcv");
File uidActualFileSent = new File(uidFileDir,"tcp_snd");

 String textReceived = "0";
 String textSent = "0";

 try {
        BufferedReader brReceived = new BufferedReader(new FileReader(uidActualFileReceived));
        BufferedReader brSent = new BufferedReader(new FileReader(uidActualFileSent));
        String receivedLine;
        String sentLine;

        if ((receivedLine = brReceived.readLine()) != null) {
            textReceived = receivedLine;
        }
        if ((sentLine = brSent.readLine()) != null) {
            textSent = sentLine;
        }

    }
    catch (IOException e) {

    }
 return Long.valueOf(textReceived).longValue() + Long.valueOf(textReceived).longValue();

}
于 2013-08-03T02:22:05.063 に答える
3

/proc/uid_stat/<uid>TrafficStats クラスは、ディレクトリからネットワーク トラフィックに関する情報を取得します。これには、送受信された tcp、udp バイト、およびパケットに関する情報が含まれます。ファイルが存在しない場合、TrafficStats クラスはネットワーク統計を取得できません。ファイルが存在するかどうかを確認できます。存在しない場合は運が悪く、他の方法を探す必要があります。

ファイルが存在する場合は、自分で読み取ってみることができます。

また、getUidTxBytes() および getUIDRxBytes() は、TCP トラフィックのみを報告し、UDP トラフィックを見逃します。したがって、アプリが大量の UDP トラフィック (voip など) を処理している場合、情報は得られません。これについてはすでにバグが報告されています: https://code.google.com/p/android/issues/detail?id=32410

于 2013-07-30T06:37:05.620 に答える
2

Android 4.3 以降、デバイスから詳細を抽出する方法が TrafficStats API で変更されました。

Android 4.3 より前の UID トラフィック統計は、TCP と UDP で利用でき、バイトとパケットと送受信の API が含まれていました。そのデータは /proc/uid_stat/[pid]/* ファイルから抽出されました。

Android 4.3 では、開発者は Linux の netfilter カーネル モジュールの一部である xt_qtaguid UID 統計を使用して、より安全で優れた API に切り替えることにしました。この API (procfs) は、プロセス UID に基づいてアクセスを許可します。これが、Android=>4.3 で TrafficStats API にアクセスしようとすると、所有していない UID の情報がゼロになる理由です。

ところで、問題の原因となったコミットは次のとおりです

*TrafficStats UID API を改善します。要約されたネットワーク層の統計のみを残して、トランスポート層の統計を非推奨にします。ドキュメントを改善して、測定が行われるレイヤーと、起動後の動作について明確にします。内部では、xt_qtaguid UID 統計の使用に移行します。バグ: 6818637、7013662 変更 ID: I9f26992e5fcdebd88c671e5765bd91229e7b0016*

于 2013-10-27T00:58:57.570 に答える