7

(これはよくある質問だと思いますが、私の回答が議論に何か新しいものを追加すると信じているので、あまり早く重複としてマークしないでください。)

関連する API はTrafficStatsで、たとえば /proc/uid_stat/ からデータを取得します。

統計には、私が開始したものだけでなく、GCM なども含まれている必要があるため、スレッドおよびタグ ベースのカウンターでは十分ではありません。

最初の問題は、UID (つまり、アプリごと) に基づいてモバイル データの使用状況を取得する API が著しく欠如していることです。getMobile API と getUid API がありますが、それらを組み合わせたものはありません。以下の1つの答えとして、これに対する解決策を提案します。

さらに重要なことに、TrafficStats にはバグが多すぎて、この一般的な目的には使用できないという印象を受けています。私もそれを可能な答えとして挙げました。それが受け入れられた場合、最善の解決策はデータ使用量を手動でカウントすることです。

4

2 に答える 2

4

これが私の最初の解決策です。API は実際には古いものと新しいものの両方で複数の方法で壊れているため、これは修正された場合に使用できるソリューションにすぎません。

アプリの統計情報を取得するのは簡単です:

int uid = android.os.Process.myUid();
txBytesInitial = TrafficStats.getUidTxBytes(uid);
rxBytesInitial = TrafficStats.getUidRxBytes(uid);

そのため、ネットワーク接続が失われるたびに (またはアプリが閉じられるか、アプリ ロジックで統計が必要になる)、NetworkInfo.getType() に基づいて、アプリのデータ使用量のデルタが統計に追加されます。デルタ計算で使用するために最後に取得したものを維持する必要があり、これらはたとえば SharedPreferences に保存し、電話が再起動したとき、または間違った方向に進んだときにリセットする必要があります (デバイスによっては、他の理由でリセットできる場合があります)。その後再起動します)。

これらの API に関する追加の説明が記載された、この便利な SO 投稿を参照してください(たとえば、パケットのオーバーヘッドは含まれず、ペイロードのみが含まれます)。

于 2013-10-17T19:18:08.233 に答える
2

最良の解決策は、wireshark のようなものを使用して、アプリのさまざまなネットワーク操作で使用されるデータを測定し、データ消費を手動で追跡することだと思います。これは確かに実行可能です。

私が言うには、TrafficStats のバグは修正されるよりも早く蓄積され、パッチが無視されているため、TrafficStats は維持されておらず、回避する必要があるという印象を受けます。JBQ は彼が辞める前に多くの人を割り当てましたが、彼は単に後片付けをしていたと思います。Android の設定にデータ使用統計が含まれていることを認識しています。私は調査していませんが、それらも信頼できないと推測します (怠け者で申し訳ありませんが、手動で計算を行った場合に無駄な時間が大幅に短縮されたと既に結論付けています)。

以下は、一般的な API を調べているときに遭遇した、trafficstats のバグの一部です (問題の一部は TrafficStats にあり、一部はカーネルに由来します)。私はスレッド/タグ/ソケット ベースの API を試したことがなく、これまでの経験に基づいて試すつもりもありませんが、それらがよりうまく機能するかどうかを知りたいと思っています。

2.x
Android では、TrafficStats.getTotalRxBytes() が予想より少ない

3.x では
、TrafficStats.getMobileRxBytes() および TrafficStats.getMobileTxBytes():
https://code.google.com/p/android/issues/detail?id=19938
API レベル 12 以降であっても、TrafficStats API は UDP トラフィックを報告しません。サポートされているはずです (修正されません):
https://code.google.com/p/android/issues/detail?id=32410

4.3 では、getUid API が完全に壊れていますが、このバグの修正を計画しているようです。とにかく、バグが Google のパートナーに渡った場合、これらの API は当面の間役に立たないと思います。

4.3 では、TrafficStats.getUidRxBytes と getUidTxBytes は常に 0 を返します:
https://code.google.com/p/android/issues/detail?id=58210
そして、この SO 投稿を参照してください。

于 2013-10-17T19:40:50.463 に答える