本文仅仅是通过adb查询应用的流量使用情况。当然在Android应用程序的Java代码中同样可以获得应用的流量使用情况。
1、获得应用的Pid。
可以通过adb shell ps获得所有进程信息,里面当然包含应用的pid和包名。然后对返回信息进行查找(按包名查找)。
2、获得应用的Uid.
Android系统的目录文件/proc/pid/status(注意:标红的pid是第1步中获得的pid,是一个大于0的数字)中包含关于uid的信息。以pid=7328为例,通过adb shell cat /proc/7328/status可以得到以下信息:
1|shell@p1:/ $ cat /proc/7328/status
cat /proc/7328/status
Name: .qihoo.secstore
State: S (sleeping)
Tgid: 7328
Pid: 7328
PPid: 479
TracerPid: 0
Uid: 10194 10194 10194 10194
Gid: 10194 10194 10194 10194
FDSize: 128
Groups: 1015 1028 3001 3002 3003 9997 50194
VmPeak: 1828500 kB
VmSize: 1709912 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 123552 kB
VmRSS: 62932 kB
VmData: 186776 kB
VmStk: 8192 kB
VmExe: 12 kB
VmLib: 87568 kB
VmPTE: 716 kB
VmSwap: 21692 kB
Threads: 44
SigQ: 0/9853
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000001a04
SigIgn: 0000000000000000
SigCgt: 00000002000094f8
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000000000000000
Cpus_allowed: 3f
Cpus_allowed_list: 0-5
voluntary_ctxt_switches: 5671
nonvoluntary_ctxt_switches: 4188
解析以上信息即可得到Uid.
3、读取流量值。
Android系统的目录文件/proc/uid_stat/uid/下一般会有两个文件tcp_snd和tcp_rcv。(注意:标红的uid是第二步中获得的Uid数值)。通过adb shell cat /proc/uid_stat/10194/tcp_snd和adb shell cat /proc/uid_stat/10194/tcp_rcv即可分别获得上行流量和下行流量。
shell@p1:/ $ ls /proc/uid_stat/10194
ls /proc/uid_stat/10194
tcp_rcv
tcp_snd
shell@p1:/ $
shell@p1:/ $ cat /proc/uid_stat/10194/tcp_snd
cat /proc/uid_stat/10194/tcp_snd
36006
shell@p1:/ $ cat /proc/uid_stat/10194/tcp_rcv
cat /proc/uid_stat/10194/tcp_rcv
41460
注意:
1、这里的值的单位是Byte字节,并且是累积量
2、有的应用是没有tcp_snd和tcp_rcv这两个文件的,比如某些系统应用。
3、某些没有流量交换的应用的可能也没有这两个文件,或者这两个文件里没有数据。