Shell脚本 | 性能测试之启动流量
安卓应用的流量统计有多种方式,点击「阅读原文」可以看到一篇别人写的文章,关于安卓流量数据的获取,写的挺全的,列举了几种不同方式的优劣。(见文末参考链接)
今天我要分享的是通过脚本一键获取应用的启动流量。脚本的编写方式和之前的《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脚本 | 性能测试之启动流量的更多相关文章
- Shell脚本 | 性能测试之启动时间
安卓应用的性能测试,通常包括六个指标:启动时间.内存.CPU.耗电量.流量.流畅度. 除了耗电量,其他五个指标的数据在我们团队中已经可以通过运行脚本的方式获取到. 今天给大家分享下启动时间的脚本吧- ...
- Shell脚本 | 性能测试之内存
性能测试中,内存是一个不可或缺的方面.比如说在跑 Monkey 的过程中,如何准确持续的获取到内存数据就显得尤为重要. 今天分享一个脚本,可以在给定时间内持续监控内存,最后输出成一份 CSV 文件,通 ...
- Shell脚本 | 性能测试之CPU占有率
Android 是一个基于 Linux 内核的移动操作系统,Linux 的 CPU 占有率的计算方式也可以应用到 Android App 上. 今天分享的这个脚本的功能,是在多核情况下计算进程的 CP ...
- shell脚本计算Linux网卡流量
本文介绍了计算linux网卡流量的一个shell脚本,一个通过固定间隔时间获取ifconfig eth0 的字节值而计算出网卡流量的方法,有需要的朋友参考下. 使用shell脚本计算Linux网卡流量 ...
- shell脚本批量/单独启动、停止、重启java独立jar程序
本人最近半年使用阿里dubbo做开发,并在公司内部大力进行推广,将原来一个笨重且不易于维护的大项目切分成多个相对独立的java程序,好处是显而易见的,但是随着切分的独立运行程序包越来越多,程序的部署变 ...
- 写了shell脚本想一键启动三台虚拟机的Zookeeper,却不知道为啥总是启动不了
首先,一键启动的shell脚本是这样的 #! /bin/bash case $1 in "start"){ for i in node01 node02 node03 do ssh ...
- shell脚本之nginx启动脚本、统计日志字段、for循环实战、跳板机
1.NGINX启动脚本 #!/bin/bash # chkconfig: 235 32 62 # description: nginx [ -f /etc/init.d/functions ] &am ...
- [shell脚本] mysql服务启动脚本
服务启动脚本(初始化.启动.登录) #!/bin/bash export PID=/usr/local/nestdb_master/bin/mysqld export PASSWORD=123456 ...
- shell脚本带参数启动项目
用maven工程打包时,会将数据库连接一并打进去,如果需要经常修改数据库连接,则需要打开jar包然后修改配置,这样很麻烦耗时并且容易出错. 因此需要将数据库配置放入项目外,这样修改数据库时去固定的配置 ...
随机推荐
- Fortran编译器之一GUN Fortran安装(Windows XP)
最近研究GIS算法,需要用到Fortran语言.在网上找了一下发现一个开源的软件GUN Fortran编译器.当然既然是编译器,就是编译出程序的,但是编辑器不包括在内.编辑器可以用Text记事本,或者 ...
- bzoj2388(分块 凸包)
好像没有什么高级数据结构能够很高效地实现这个东西: 那就上万能的分块,我们用一些数形结合的思想,把下标看成横坐标,前缀和的值看成纵坐标: 给区间内每个数都加k相当于相邻两点的斜率都加上k: 这种东西我 ...
- mach_absolute_time 使用
今天看荣哥时间常用函数封装里有个不常见的函数 ,mach_absolute_time() ,经查询后感觉是个不错的函数,网上关于这个函数搜索以后简单整理来一下. 什么事Mach? 时间例程依赖于所需要 ...
- hihocoder 二分·二分答案【二分搜索,最大化最小值】 (bfs)
题目 这道题做了几个小时了都没有做出来,首先是题意搞了半天都没有弄懂,难道真的是因为我不打游戏所以连题都读不懂了? 反正今天是弄不懂了,过几天再来看看... 题意:一个人从1点出发到T点去打boss, ...
- codeforces 434D
题意:有n<=50个点,每个点有xi有[li, ri]种取值,-100 <= li <= ri <= 100,并且给定m<=100条边,每条边为u,v,d表示xu< ...
- Effective C++ 第二版 31)局部对象引用和函数内new的指针 32)推迟变量定义
条款31 千万不要返回局部对象的引用, 不要返回函数内部用new初始化的指针的引用 第一种情况: 返回局部对象的引用; 局部对象--仅仅是局部的, 在定义时创建, 在离开生命空间时被销毁; 所谓生命空 ...
- CSS 基础 例子 盒子模型及外边距塌陷
我们通常设置的宽度和高度,是指盒子模型中内容(content)的宽度和高度.元素的高度,还要加上上下padding和上下border,元素整个盒子的高度还要加上上下margin:宽度类似计算. 注意: ...
- Http TCP/IP协议和socket之间的区别和联系
总结,TCP/IP是传输层协议,主要解决数据如何在网路中传输,socket是TCP/IP协议的具体实现,是对TCP/IP协议的封装和应用,属于程序员层面,HTTP是应用层协议,应用层协议很多,类似的像 ...
- ELK冷热数据分离
通常情况下,我们使用ELK日志分析平台最常用的数据时间为1周或一个月(因业务场景不同,可能存在差别),时间比较长的数据没有特殊情况可能我们就没有必要再进行查询了,但是因业务需求或者作为凭证,这些日 ...
- 如何获取SQL中Print语句输出内容
SqlConnection cn = new SqlConnection("server=my\\my2005;database=rdwhdata2005;user id=zjh;passw ...