web-dev-qa-db-ja.com

ADBを使用したアプリケーションのネットワーク統計(netstats)の追跡

私はこれが可能であると感じています、私は情報がどこに保持されているのかよくわかりません。

特定のアプリケーションのアップ/ダウン統計を取得したいのですが、wiresharkやnettyではなくADBを使用して取得したいと思います。

私はvmDataを使用して見ることができることを知っています

adb Shell
cd proc
cd pid#
cat status 

そして、私は以下を使用してnetstatsを見ることができることを知っています:

ADB Shell dumpsys netstats details full

これは私にこれらの結果を与えます:

Dev stats:

  Pending bytes: 1410076

  Complete history:

  ident=[[type=MOBILE, subType=COMBINED, subscriberId=310260...]] uid=-1 set=ALL tag=0x0
NetworkStatsHistory: bucketDuration=3600000
  bucketStart=1349211600000 activeTime=3600000 rxBytes=19656154 rxPackets=16897 txBytes=615620 txPackets=8084 operations=0
  bucketStart=1349215200000 activeTime=3600000 rxBytes=28854708 rxPackets=23363 txBytes=1037409 txPackets=12206 operations=0
  bucketStart=1349218800000 activeTime=3600000 rxBytes=1839274 rxPackets=1565 txBytes=89791 txPackets=914 operations=0
  bucketStart=1349222400000 activeTime=3600000 rxBytes=17421 rxPackets=88 txBytes=18376 txPackets=95 operations=0
  bucketStart=1349226000000 activeTime=3600000 rxBytes=506966 rxPackets=788 txBytes=96491 txPackets=859 operations=0

残念ながら、これはアプリケーションを区別しない結合されたnetstatのように見えます。

だから私の質問は、コマンドプロンプトを使用するだけで、一意のPID番号またはアプリケーション名でネットワークトラフィックを確認する方法はありますか?


[〜#〜]編集[〜#〜]


さて、私はいくつかの良い進歩を遂げました

このコードで

 adb Shell cat proc/1638(thePID)/net/dev > C:\netstats.txt 

私はこの情報を得ることができます:

Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
lo:        3564      28    0    0    0     0          0         0     3564      28    0    0    0     0       0          0
dummy0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
rmnet0: 117062940  191775  0    0    0     0          0         0 19344640  177574    0    0    0     0       0          0
rmnet1: 2925492    5450    0    0    0     0          0         0  1448544    5664    0    0    0     0       0          0
rmnet2:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
rmnet3:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
rmnet4:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
rmnet5:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
rmnet6:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
rmnet7:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
  sit0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
  vip0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0

残念ながら、Androidマーケットプレイスの「NetworkUsage」などのプログラムでこれらの数値を再確認したところ、これらの数値はデバイス全体の上下の合計であることがわかりました。

それでも、「ネットワーク使用法」や「スペアパーツ」などのプログラムは、どのように/どこから情報を取得しているのでしょうか。

17
Nefariis

「スペアパーツ」と「ネット使用量」がどこから情報を取得するのかがわかりました。

adb Shell cat proc/uid_stat/(uid#)/tcp_rcv
adb Shell cat proc/uid_stat/(uid#)/tcp_snd

しかし、彼らがそれをどのように行っているかで私が見る問題は、これがTCPの使用量のみを説明し、UDPの使用量を説明しないことです。

Tx_bytesとrx_bytesの合計を把握する唯一の方法は、このコマンドを使用することです。

adb Shell cat /proc/net/xt_qtaguid/stats

または、テキストファイルに変換して、より簡単に表示したい場合。

adb Shell cat /proc/net/xt_qtaguid/stats > C:\Netstats.txt

これにより、次のようなものが得られます。

------ QTAGUID STATS INFO (su root cat /proc/net/xt_qtaguid/stats) ------

idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packets     rx_tcp_bytes rx_tcp_packets rx_udp_bytes rx_udp_packets rx_other_bytes   rx_other_packets tx_tcp_bytes tx_tcp_packets tx_udp_bytes tx_udp_packets tx_other_bytes tx_other_packets
2 rmnet0 0x0 0 0 18393 326 8506 166 10889 267 7504 59 0 0 4180 101 3397 54 929 11
3 rmnet0 0x0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 rmnet0 0x0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5 rmnet0 0x0 1000 1 7181 14 1834 19 7023 12 158 2 0 0 1616 16 218 3 0 0
6 rmnet0 0x0 10001 0 5723 19 3162 26 5723 19 0 0 0 0 3162 26 0 0 0 0
7 rmnet0 0x0 10001 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
8 rmnet0 0x0 10007 0 1895740 1570 44556 898 1895740 1570 0 0 0 0 44556 898 0 0 0 0
9 rmnet0 0x0 10007 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
10 rmnet0 0x0 10019 0 5319 12 2546 14 5319 12 0 0 0 0 2546 14 0 0 0 0
11 rmnet0 0x0 10019 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
12 rmnet0 0x0 10026 0 6866 19 2846 24 6866 19 0 0 0 0 2846 24 0 0 0 0
13 rmnet0 0x0 10026 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

4番目のタブ(1000、10001など)はUID番号です。どのアプリケーションがどのUID番号に属しているかを確認する最も簡単な方法は次のとおりです。

adb Shell dumpsys package > C:\apps.txt

「Package:」セクションに移動し、「userid =」というラベルの付いたプロセス名の後の最初の行に移動します。

上記のチャートを読むために、知りたい主な2つの数値は、(rx_bytes)の6番目の数値と(tx_bytes)の8番目の数値です。これらの2つの数値は、特定のアプリケーションについて、入力および出力されるすべてのバイトを正確に表したものである必要があります。

楽しい。

20
Nefariis

Nefariiのコメントにスニペットを追加すると、特定のアプリケーション(com.example.myappなど)のUIDを見つける最も簡単な方法は次のとおりです。

adb Shell dumpsys package com.example.myapp | grep userId=

1
Joe Bowbeer