问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Android 通过adb命令查看应用流量

创作时间:
2025-01-22 19:54:41
作者:
@小白创作中心

Android 通过adb命令查看应用流量

在开发或使用Android应用时,有时需要监控应用的网络流量使用情况。本文将详细介绍如何通过adb命令查看应用的流量数据,包括获取应用PID、查看实时流量、计算具体业务场景下的流量使用,以及使用netstats服务进行详细的网络流量诊断。

一. 获取应用pid号

通过adb shell ps -A | grep 包名 来获取app的 pid号

二. 查看应用流量情况

使用
adb shell cat /proc/#pid#/net/dev
命令 来获取流量数据

备注:

Recevice: 表示收包

Transmit: 表示发包

bytes: 表示收发的字节数

packets: 表示收发正确的包量

errs: 表示收发错误的包量

drop: 表示收发丢弃的包量

wlan0: 表示代表的是wlan端口,wifi流量就是用的这个Interface

三. 计算使用流量

  1. 先记录此时的流量情况

  2. 然后操作业务场景,再记录一次流量情况

  3. 前后数据相减就得到了流量使用,这里用的单位是byte 然后换成M(兆)即可

四. 网络流量诊断情况

指定

netstats

服务可提供自设备上次启动以来收集的网络使用情况统计信息。若要输出额外信息,如详细的唯一用户 ID (UID) 信息,请包含

detail

选项,如下所示:


#查看设备开机以来各应用流量的使用情况
adb shell dumpsys netstats detail
#查看各应用历史流量使用情况
adb shell dumpsys netstats --full --uid --tag  

输出内容因连接的设备上搭载的 Android 版本不同而异。以下部分介绍您通常会看到的信息类型。

活动接口和活动 UID 接口

以下示例输出内容中列出了连接的设备的活跃接口和活跃 UID 接口。在大多数情况下,活跃接口和活跃 UID 接口的信息是相同的。


Active interfaces:
  iface=wlan0 ident=[{type=WIFI, subType=COMBINED, networkId="Guest"}]
Active UID interfaces:
  iface=wlan0 ident=[{type=WIFI, subType=COMBINED, networkId="Guest"}]  

“Dev”和“Xt”统计信息

以下是 Dev 统计信息部分的示例输出:


Dev stats:
  Pending bytes: 1798112
  History since boot:
  ident=[{type=WIFI, subType=COMBINED, networkId="Guest", metered=false}] uid=-1 set=ALL tag=0x0
    NetworkStatsHistory: bucketDuration=3600
      st=1497891600 rb=1220280 rp=1573 tb=309870 tp=1271 op=0
      st=1497895200 rb=29733 rp=145 tb=85354 tp=185 op=0
      st=1497898800 rb=46784 rp=162 tb=42531 tp=192 op=0
      st=1497902400 rb=27570 rp=111 tb=35990 tp=121 op=0
Xt stats:
  Pending bytes: 1771782
  History since boot:
  ident=[{type=WIFI, subType=COMBINED, networkId="Guest", metered=false}] uid=-1 set=ALL tag=0x0
    NetworkStatsHistory: bucketDuration=3600
      st=1497891600 rb=1219598 rp=1557 tb=291628 tp=1255 op=0
      st=1497895200 rb=29623 rp=142 tb=82699 tp=182 op=0
      st=1497898800 rb=46684 rp=160 tb=39756 tp=191 op=0
      st=1497902400 rb=27528 rp=110 tb=34266 tp=120 op=0  

上面log信息是用于统计设备总流量情况

St=1497895200 是时间戳,转化成北京时间为:2017-06-20 03:00:00

bucketDuration=3600 单位是秒 就是每隔1小时记录一次流量使用

UID 统计信息

以下是每个 UID 的详细统计信息的示例:


UID stats:
  Pending bytes: 744
  Complete history:
  ident=[[type=MOBILE_SUPL, subType=COMBINED, subscriberId=311111...], [type=MOBILE, subType=COMBINED, subscriberId=311111...]] uid=10007  set=DEFAULT tag=0x0
    NetworkStatsHistory: bucketDuration=7200000
      bucketStart=1406167200000 activeTime=7200000 rxBytes=4666 rxPackets=7 txBytes=1597 txPackets=10 operations=0
  ident=[[type=WIFI, subType=COMBINED, networkId="MySSID"]] uid=10007  set=DEFAULT tag=0x0
    NetworkStatsHistory: bucketDuration=7200000
      bucketStart=1406138400000 activeTime=7200000 rxBytes=17086802 rxPackets=15387 txBytes=1214969 txPackets=8036 operations=28
      bucketStart=1406145600000 activeTime=7200000 rxBytes=2396424 rxPackets=2946 txBytes=464372 txPackets=2609 operations=70
      bucketStart=1406152800000 activeTime=7200000 rxBytes=200907 rxPackets=606 txBytes=187418 txPackets=739 operations=0
      bucketStart=1406160000000 activeTime=7200000 rxBytes=826017 rxPackets=1126 txBytes=267342 txPackets=1175 operations=35  

如需查找应用的 UID,请运行以下命令:

adb shell dumpsys package your-package-name

。然后查找标有

userId

的行。

例如,如需查找应用“com.example.myapp”的网络使用情况,请运行以下命令:


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

输出的内容应类似于以下文本:


userId=10007 gids=[3003, 1028, 1015]  

使用上述示例转储,查找包含

uid=10007

的行。有两个这样的行,第一个表示移动数据连接,第二个表示 Wi-Fi 连接。在每一行下方,您可以看到每个两小时期限(

bucketDuration

以毫秒为单位表示)的以下信息:

set=DEFAULT

表示前台网络使用情况,

set=BACKGROUND

表示后台网络使用情况,

set=ALL

表示这两种网络使用情况。

tag=0x0

表示与流量关联的套接字标记。

rxBytes

rxPackets

表示在相应时间间隔内接收的字节数和数据包数。

txBytes

txPackets

表示在相应时间间隔内发送(传输)的字节数和数据包数。

总结: 第四种方式,需要自己去把每个时间段的接收和发送的byte数相加处理,然后统计总流量

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号