android - 使用 ADB 跟踪应用程序的网络统计信息 (netstats)

标签 android adb netstat

我觉得这是可能的,我只是不太确定信息保存在哪里。

我想获取特定应用程序的上升/下降统计信息,但我想使用 ADB 而不是 wireshark 或 netty 来完成。

我知道我可以使用

查看 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 市场上的“网络使用”之类的程序仔细检查了这些数字后,我发现这些数字是整个设备的上下总数。

所以我仍然想知道,“网络使用”和“备件”之类的程序到底是如何/从哪里获取信息的?

最佳答案

我知道“备件”和“网络使用情况”从哪里获取信息。

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

第四个标签(1000、10001 等)是 UID 号。找出哪个应用程序属于哪个 UID 号的最简单方法:

adb shell dumpsys package > C:\apps.txt

转到“Package:”部分,然后在标有“userid=”的进程名称之后的第一行。

现在阅读上面的图表,您想知道的主要两个数字是(rx_bytes)中的第 6 个数字和(tx_bytes)中的第 8 个数字。对于任何特定的应用程序,这两个数字应该是所有输入和输出字节的准确描述。

享受吧。

关于android - 使用 ADB 跟踪应用程序的网络统计信息 (netstats),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12904809/

相关文章:

android - 自 SDK API 9 升级以来,DDMS 抛出 ADB 错误

java - 即使应用程序崩溃后,IPV6 ServerSocket 仍在监听

c - 获取使用的端口和状态

shell - 命令 "netstat -p"不显示 pid

android - 如何在android中找到扬声器是否打开

java - Android Studio 中的增强现实

Android Studio 无法在设备上运行项目?

java - 我的 Retrofit call.enqueue() 方法被完全跳​​过,不知道为什么

android - 更新 RecyclerView.Adapter

android - 无法初始化监视器线程 : Unable to establish loopback connection