安卓应用的流量统计有多种方式,点击「阅读原文」可以看到一篇别人写的文章,关于安卓流量数据的获取,写的挺全的,列举了几种不同方式的优劣。(见文末参考链接)
今天我要分享的是通过脚本一键获取应用的启动流量。脚本的编写方式和之前的《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”,更多原创文章第一时间发布