单个应用流量统计实现和核对

1.通过包名获得应用的Uid:

try {
             PackageManager pm = getPackageManager();
             ApplicationInfo ai = pm.getApplicationInfo("cn.com.wasu.main", PackageManager.GET_ACTIVITIES);
             WLog.d("test", "uid=" + ai.uid);
            } catch (NameNotFoundException e) {
              e.printStackTrace();
            }

2.根据uid获得流量
TrafficStats.getUidTxBytes(uid)获得上传的流量
TrafficStats.getUidRxBytes(uid)获得下载的流量

3.通过adb命令和核对流量是否正确

   cd proc                             进入设备的属性目录
    cd uid_stat                         进入 user id 状态目录,每个应用程序在安装的时候系统会为每个应用分配一个对应的 uid
    ls                                  列出 uid_stat 目录下所有应用对应的 user id 目录
    cd uid                              进入对应应用的 uid 目录
    ls                                  查看对应 uid 目录下的 tcp_rcv 和 tcp_snd 目录
    cat tcp_rcv                         查看该应用接收的数据信息
    cat tcp_snd                         查看该应用发送的数据信息

 4.uid的说明:

这里需要注意的是不同语言编写的应用程序对应的的 uid 命名规则是不同的,如果是 Java 编写的应用程序,它的 uid 是从 10000 开始的,如果是 C 语言编写的,它的 uid 是从 1000 开始的。另外,uid 一旦被分配,是不会改变的。从下图中我们可以看到类似app_0、app_1、app_3、app_4 的信息,这些信息也代表了 uid,也就是说 app_0 等同于 10000,app_1 等同于 10001,事实上“app_”后面的信息代表这个应用的安装序号,表示这个应用是第几个被安装到系统的

5.补充知识点

//1.获取一个包管理器。
PackageManager pm = getPackageManager();
//2.遍历手机操作系统 获取所有的应用程序的uid
List appliactaionInfos = pm.getInstalledApplications(0);
for(ApplicationInfo applicationInfo : appliactaionInfos){
    int uid = applicationInfo.uid;    // 获得软件uid
    //proc/uid_stat/10086
    long tx = TrafficStats.getUidTxBytes(uid);//发送的 上传的流量byte
    long rx = TrafficStats.getUidRxBytes(uid);//下载的流量 byte
    //方法返回值 -1 代表的是应用程序没有产生流量 或者操作系统不支持流量统计
}
TrafficStats.getMobileTxBytes();//获取手机3g/2g网络上传的总流量
TrafficStats.getMobileRxBytes();//手机2g/3g下载的总流量
 
TrafficStats.getTotalTxBytes();//手机全部网络接口 包括wifi,3g、2g上传的总流量
TrafficStats.getTotalRxBytes();//手机全部网络接口 包括wifi,3g、2g下载的总流量</applicationinfo>


猜你喜欢

转载自blog.csdn.net/nshzzu130/article/details/49024865