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

19

我有一种感觉这是可能的,只是不太确定信息存储在哪里。

我想使用 ADB 而不是 wireshark 或 netty 获取特定应用程序的上/下统计信息。

我知道可以使用 vmData 查看

adb shell
cd proc
cd pid#
cat status 

我知道可以使用以下方式查看网络统计信息:

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市场上的“网络使用”这样的程序仔细核对这些数字后发现,这些数字是整个设备上下行的总和。

所以,我仍然不知道“网络使用”和“备用零件”等程序从哪里获取它们的信息。


哇,这里有大量有用的信息。感谢您发布这个。 - Edward Falk
谢谢,如果您需要了解其他信息或有任何问题,请告诉我。很可能我已经为此编写了脚本,或者可以指引您正确的方向。 - Nefariis
@Nefarii 我正在做类似的事情,但没有超级用户权限,有没有办法在不使用su的情况下实现相同的功能? - SwiftParser
@Swiftparser - 这不需要SU权限。实际上,我每周都在全新设备上运行此命令,而无需SU特权。 - Nefariis
2个回答

21

我已经找到了“备件”和“网络使用情况”获取信息的地方。

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个数字)。这两个数字应该准确地反映了任何特定应用程序的所有流入和流出的字节数。

享受吧。


1
它在2.3上无法工作,似乎/proc/net/xt_qtaguid/stats在Gingerbread上不可用。 - Ajeet47
当我第一次开始开发这个项目时,我相信我是同时使用了Gingerbread和Ice Cream Sandwich...虽然我认为那时候至少已经是2.3.6了....另外,你还在使用2.3吗?你能手动进入文件夹吗?"adb shell"> "cd /proc/net/xt_qtaguid"?如果你可以做到这一点,那么输入"ls"并查看是否存在"stats",如果存在,则只需输入"cat stats"。 - Nefariis
/proc/net/xt_qtaguid/在2.3中不存在。 - Ajeet47
adb shell cat /proc/net/xt_qtaguid/stats 这个命令会在任何给定的时刻提供网络统计信息,还是自应用程序安装以来的总网络使用情况?我的用例是为给定的实例/日期时间获取网络统计信息。 - Harshawardhan
最简单的找到 UID 的方法是查看 /proc/#pid/status - André Chalella
显示剩余2条评论

1

在 Nefarii 的评论中添加一个片段,找到特定应用程序的 UID(例如 com.example.myapp)的最简单方法是:

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


我从来没有能够正确地使用grep,即使是在安装了最新版本的busybox之后。 - Nefariis
1
grep在Android下无法工作,你需要在主机上运行它。我猜如果你试图从Windows进行开发,你可能会遇到一些问题。 - Edward Falk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接