2013-10-17 25 views
6

(これはよくある質問ですが、私の回答がディスカッションに何か新しいものを加えると思われるので、重複しすぎるとマークしないでください)私のアプリのモバイルデータの使用方法(TrafficStatsの使用など)

関連するAPIはTrafficStatsで、そのデータはたとえば/ proc/uid_stat /。

統計情報には、私が開始するものだけでなく、GCMなどが含まれている必要があります。したがって、スレッドベースとタグベースのカウンタでは不十分です。

最初の問題は、UID(つまりアプリごと)に基づいてモバイルデータを使用するためのAPIが顕著に欠けていることです。 getMobile APIとgetUid APIがありますが、それらを結合するものはありません。私はこの答えを一つの答えとして提案します。

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

答えて

2

ベストソリューションは、アプリのさまざまなネットワーク操作で使用されるデータを測定するためにwiresharkのようなものを使用し、データ消費を手動で追跡することです。それは確かに可能です。

私は、TrafficStatsのバグが累積していて修正されていてパッチが無視されているため、TrafficStatsが維持されていないという印象を受けました。 JBQは辞める前に多くの人に割り当てられましたが、私は彼がただ掃除していたと信じています。 Androidの設定にはデータ使用状況の統計情報が含まれています。私は調査していませんが、それらも信頼性がないと推測します(私は怠惰だと申し訳ありませんが、私は手作業で計算した場合、ずっと少ない時間を無駄にしてしまったと結論づけました)。

一般的なAPIを見ながら、私が遭遇したトラフィックの不具合のいくつかを示します(TraffficStatsには問題があり、カーネルにはいくつかの問題があります)。私はスレッド/タグ/ソケットベースのAPIを試していないし、これまでのところ私の経験に基づいて計画していないが、彼らがうまくいけば聞くことに興味があります。 3.xの
TrafficStats.getMobileRxBytes()とTrafficStatsにおいて

2.xで


Android TrafficStats.getTotalRxBytes() is less than expected

。getMobileTxBytes():
https://code.google.com/p/android/issues/detail?id=19938
TrafficStats APIはAPIレベル12以降は、彼らが(固定決して)はサポートされていなければならないにもかかわらず、UDPトラフィックを報告しません:4.3で
https://code.google.com/p/android/issues/detail?id=32410

、GETUID APIがのが完全に壊れているが、このバグを修正しようと思っているようです。いずれにしても、バグがGoogleのパートナーに引き継がれていれば、将来的にはこれらのAPIは役に立たないと思う。

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

3

私の初期の解決策です。 APIは、古いものと新しいものの両方で複数の方法で実際に破られているので、修正された場合に使用できる解決策に過ぎません。だから、

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

、ネットワーク接続が失われるたびに(またはアプリが閉じ、または統計情報はアプリのロジックで必要とされている)、アプリのデータ使用量のデルタが追加されます。アプリの統計情報を取得

は簡単です。あなたの統計に、NetworkInfo.getType()に基づいています。デルタ計算で使用するために最後に取得したものを維持する必要があり、これらはデルタ計算に使用する必要があります。 SharedPreferencesは、電話が再起動したとき、または間違った方向に移動したときにリセットされます(再起動以外の理由でリセットできるデバイスに応じて)。

this useful SO postを参照してください(これらのAPIには、パケットオーバーヘッド、ペイロードなどは含まれません)。

関連する問題