安卓应用的流量统计有多种方式,点击「阅读原文」可以看到一篇别人写的文章,关于安卓流量数据的获取,写的挺全的,列举了几种不同方式的优劣。(见文末参考链接)

今天我要分享的是通过脚本一键获取应用的启动流量。脚本的编写方式和之前的《Shell脚本 | 性能测试之启动时间》有点类似。其实写了这么多shell脚本,说白了就是把各种平时手动执行的adb命令整合起来,然后再通过awk、grep、sed等命令将特定位置的数据从源文件里取出来经过加减乘除等操作最后输出想要的信息。

所以你看,也没多大技术含量。

那就废话少说,直接上代码吧,注释详细点就好:

#!/bin/bash
# 此脚本运行前,应用安装后已启动过
# 输入参数: <Package_Name>/<Activity_Name>
component=$1
# 截取包名
packagename=$(echo $1 | cut -d"/" -f1)
echo "Package name is '$packagename'"
# 截取uid
userid=$(adb shell dumpsys package $packagename | grep userId= | sed 's/ //g' | tr -d $'\r' | cut -c 8-12)
echo "uid = $userid"
# 停止应用的一切进程和服务
adb shell am force-stop $packagename
# 清除应用数据与缓存
adb shell pm clear $packagename
# 因为应用已经启动过一次了,所以已经有了流量使用的记录。在清空应用进程和所有数据后,开始启动流量测试之前,先记录下初始值。后面一次启动产生的数值减去本次记录的数值,就是后面那次启动的流量消耗。
beforestartrcv1=$(adb shell cat /proc/uid_stat/$userid/tcp_rcv | sed 's/ //g' | tr -d $'\r')
beforestartsnd1=$(adb shell cat /proc/uid_stat/$userid/tcp_snd | sed 's/ //g' | tr -d $'\r')
# 接收的流量
echo $beforestartrcv1
# 发送的流量
echo $beforestartsnd1
# 启动应用
adb shell am start -n $component
# 等待10s,应用启动后可能会在后台异步加载一些数据资源
sleep 10s
# 获取启动后的应用流量数值(第一轮测试)
afterstartrcv1=$(adb shell cat /proc/uid_stat/$userid/tcp_rcv | sed 's/ //g' | tr -d $'\r')
afterstartsnd1=$(adb shell cat /proc/uid_stat/$userid/tcp_snd | sed 's/ //g' | tr -d $'\r')
echo $afterstartrcv1
echo $afterstartsnd1
# 本次启动耗费的总流量(参见上面的注释:"后面一次启动产生的数值减去本次记录的数值,就是后面那次启动的流量消耗。")
data1=`echo "($afterstartrcv1+$afterstartsnd1)-($beforestartrcv1+$beforestartsnd1)" | bc`
echo "启动消耗流量测试一:$data1"
# 第二轮,和上面一样的步骤:
# 1、清除应用数据与缓存
# 2、获取初始值
# 3、启动应用,等待10秒
# 4、获取最新的数值,减去初始值后即为本次启动流量消耗
adb shell am force-stop $packagename
adb shell pm clear $packagename
beforestartrcv2=$(adb shell cat /proc/uid_stat/$userid/tcp_rcv | sed 's/ //g' | tr -d $'\r')
beforestartsnd2=$(adb shell cat /proc/uid_stat/$userid/tcp_snd | sed 's/ //g' | tr -d $'\r')
echo $beforestartrcv2
echo $beforestartsnd2
adb shell am start -n $component
sleep 10s
afterstartrcv2=$(adb shell cat /proc/uid_stat/$userid/tcp_rcv | sed 's/ //g' | tr -d $'\r')
afterstartsnd2=$(adb shell cat /proc/uid_stat/$userid/tcp_snd | sed 's/ //g' | tr -d $'\r')
echo $afterstartrcv2
echo $afterstartsnd2
data2=`echo "($afterstartrcv2+$afterstartsnd2)-($beforestartrcv2+$beforestartsnd2)" | bc`
echo "启动消耗流量测试二:$data2"
# 第三轮
adb shell am force-stop $packagename
adb shell pm clear $packagename
beforestartrcv3=$(adb shell cat /proc/uid_stat/$userid/tcp_rcv | sed 's/ //g' | tr -d $'\r')
beforestartsnd3=$(adb shell cat /proc/uid_stat/$userid/tcp_snd | sed 's/ //g' | tr -d $'\r')
echo $beforestartrcv3
echo $beforestartsnd3
adb shell am start -n $component
sleep 10s
afterstartrcv3=$(adb shell cat /proc/uid_stat/$userid/tcp_rcv | sed 's/ //g' | tr -d $'\r')
afterstartsnd3=$(adb shell cat /proc/uid_stat/$userid/tcp_snd | sed 's/ //g' | tr -d $'\r')
echo $afterstartrcv3
echo $afterstartsnd3
data3=`echo "($afterstartrcv3+$afterstartsnd3)-($beforestartrcv3+$beforestartsnd3)" | bc`
echo "启动消耗流量测试三:$data3"
echo "------------------------------------"
# 计算三次测试结果的平均值(同样的步骤进行三轮然后取平均值是为了摊平单次测试可能导致的较大误差)
averagedata=`echo "($data1+$data2+$data3)/3" | bc`
echo "应用启动时流量消耗(取三次测试平均值):$averagedata bytes"

运行示例:

参考链接:

【Android】性能测试之获取Android流量数据


欢迎关注微信公众号“测试开发Stack”,更多原创文章第一时间发布

Shell脚本 | 性能测试之启动流量的更多相关文章

  1. Shell脚本 | 性能测试之启动时间

    安卓应用的性能测试,通常包括六个指标:启动时间.内存.CPU.耗电量.流量.流畅度. 除了耗电量,其他五个指标的数据在我们团队中已经可以通过运行脚本的方式获取到. 今天给大家分享下启动时间的脚本吧- ...

  2. Shell脚本 | 性能测试之内存

    性能测试中,内存是一个不可或缺的方面.比如说在跑 Monkey 的过程中,如何准确持续的获取到内存数据就显得尤为重要. 今天分享一个脚本,可以在给定时间内持续监控内存,最后输出成一份 CSV 文件,通 ...

  3. Shell脚本 | 性能测试之CPU占有率

    Android 是一个基于 Linux 内核的移动操作系统,Linux 的 CPU 占有率的计算方式也可以应用到 Android App 上. 今天分享的这个脚本的功能,是在多核情况下计算进程的 CP ...

  4. shell脚本计算Linux网卡流量

    本文介绍了计算linux网卡流量的一个shell脚本,一个通过固定间隔时间获取ifconfig eth0 的字节值而计算出网卡流量的方法,有需要的朋友参考下. 使用shell脚本计算Linux网卡流量 ...

  5. shell脚本批量/单独启动、停止、重启java独立jar程序

    本人最近半年使用阿里dubbo做开发,并在公司内部大力进行推广,将原来一个笨重且不易于维护的大项目切分成多个相对独立的java程序,好处是显而易见的,但是随着切分的独立运行程序包越来越多,程序的部署变 ...

  6. 写了shell脚本想一键启动三台虚拟机的Zookeeper,却不知道为啥总是启动不了

    首先,一键启动的shell脚本是这样的 #! /bin/bash case $1 in "start"){ for i in node01 node02 node03 do ssh ...

  7. shell脚本之nginx启动脚本、统计日志字段、for循环实战、跳板机

    1.NGINX启动脚本 #!/bin/bash # chkconfig: 235 32 62 # description: nginx [ -f /etc/init.d/functions ] &am ...

  8. [shell脚本] mysql服务启动脚本

    服务启动脚本(初始化.启动.登录) #!/bin/bash export PID=/usr/local/nestdb_master/bin/mysqld export PASSWORD=123456 ...

  9. shell脚本带参数启动项目

    用maven工程打包时,会将数据库连接一并打进去,如果需要经常修改数据库连接,则需要打开jar包然后修改配置,这样很麻烦耗时并且容易出错. 因此需要将数据库配置放入项目外,这样修改数据库时去固定的配置 ...

随机推荐

  1. 2.2.1synchronized方法的弊端

    缺陷:用关键字synchronized声明方法是有弊端的,譬如A线程调用同步方法执行一个长时间的任务,那么B线程则必须等待较长的时间, 解决方法:使用synchronized同步语句块 package ...

  2. Ng第十三课:聚类(Clustering)

    13.1  无监督学习:简介 13.2 K-均值算法 13.3  优化目标 13.4  随机初始化 13.5  选择聚类数 13.1  无监督学习:简介 在这个视频中,将开始介绍聚类算法.这将是一个激 ...

  3. android sqlite select count

    用sqlite 查数据多次都没有成功,原来是sql语句不对. 正确的示例如下: select count(*) as mycount from kehu

  4. hdu2710 Max Factor

    题目 //下面这个是最先用的方法,因为学姐先讲完这个,所以懒得写代码,就将就着这个用,结果搞了老半天,还是错了,心累.. #include<stdio.h> #include<str ...

  5. browsersync

    以后不需要F5了 之前实现自动刷新,是通过livereload,它需要插件比较麻烦:现在改为browsersync. BrowserSync,迅捷从免F5开始 完整选项 不止是自动刷新:默认就有 UI ...

  6. toast js

    参考别人的,自己改写了下,很好用. <!DOCTYPE html> <html lang="zh-CN"> <head> <meta ch ...

  7. AngularJS 路由 resolve属性

    当路由切换的时候,被路由的页面中的元素(标签)就会立马显示出来,同时,数据会被准备好并呈现出来.但是注意,数据和元素并不是同步的,在没有任何设置的情况下,AngularJS默认先呈现出元素,而后再呈现 ...

  8. AngularJS 启动执行过程

    一.浏览器下载HTML/CSS/JavaScript等 当你转到一个页面地址后,浏览器先回下载这个HTML,同时,会开启一些辅助线程下载所关联的script标签和link标签里引用的文件. 二.浏览器 ...

  9. Elasticsearch 系列1 --- Windows10安装Elasticsearch

    在Windows环境下,ES提供了两种安装方式,一种是通过MSI,特点是简单方便:另一种是绿色安装,解压zip包.本文选择第二种方式. 1. 准备工作 (1) Windows 10 (2) JDK 1 ...

  10. python 操作mysql数据库之模拟购物系统登录及购物

    python 操作mysql数据库之模拟购物系统登录及购物,功能包含普通用户.管理员登录,查看商品.购买商品.添加商品,用户充值等. mysql 数据库shop 表结构创建如下: create TAB ...