Shell脚本 | 性能测试之启动时间
安卓应用的性能测试,通常包括六个指标:启动时间、内存、CPU、耗电量、流量、流畅度。
除了耗电量,其他五个指标的数据在我们团队中已经可以通过运行脚本的方式获取到。
今天给大家分享下启动时间的脚本吧~
首先,我们先明确一下安卓应用的启动时间应该如何计算。在这里,我给出一条命令:
adb shell am start -W <Package_Name>/<Activity_Name>
"adb shell",安卓调试桥(Android Debug Bridge),这个大家都知道,不多解释。"am"指的是什么呢?Activity Manager,活动管理器,通过它可以启动App、启动Activity以及启动广播和服务等等。
安卓应用在启动时都会先出现一个欢迎页,它其实就是一个Activity。应用从被点击到出现欢迎页的这段时间,被定义为启动时间。在知道应用欢迎页的 Activity Name 后,就可以通过上面这条命令来获取启动时间。
图中的 "TotalTime" 即是本次启动所花费的时间,单位毫秒(ms)。
在知道启动时间的测试方法后,我们再来确定启动时间的不同场景。应用启动时间的场景差异,主要有四个:
1、首次安装:第一次下载应用后的启动时长;
2、覆盖安装:旧版本升级到新版本后的启动时长;
3、冷启动:杀掉应用的所有进程后的启动时长;
4、热启动:back键正常退出应用后的启动时长。
目前,我们团队的启动时间测试只包括首次安装、冷启动和热启动。
接下来,用脚本说话吧:
#!/bin/bash
# Author: Shengjie.Liu
# 安装应用,传入参数:apk文件的绝对地址
function install() {
adb install ${1}
sleep 5s
adb shell input keyevent 3
}
# 卸载应用,传入参数:应用包名
function uninstall() {
adb uninstall ${1}
sleep 2s
}
# 获取启动时间,传入参数:<包名>/<启动页活动名>
function getStartupTime() {
adb shell am start -W ${1} | grep -i Total | sed 's/ //g' | tr -d $'\r' | cut -d":" -f 2
sleep 2s
}
# 清除应用所有进程,传入参数:应用包名
function clearApp() {
adb shell am force-stop ${1}
sleep 10s
}
# Back键退出应用
function quitApp() {
adb shell input keyevent 4
adb shell input keyevent 4
adb shell input keyevent 4
sleep 2s
}
# 运行脚本后,提醒输入APK文件地址和包名&启动页活动名
read -p "请输入APK地址:" apk_address
read -p "请输入包名和活动名:" component
# 截取出包名赋值给变量"package_name"
package_name=$(echo ${component} | cut -d"/" -f1)
echo "Package name is '${package_name}'"
# 获取首次安装的启动时间,重复三次,最后取平均值
install ${apk_address}
starttime1=`getStartupTime ${component}`
uninstall ${package_name}
# 第二次
install ${apk_address}
starttime2=`getStartupTime ${component}`
uninstall ${package_name}
# 第三次
install ${apk_address}
starttime3=`getStartupTime ${component}`
sleep 20s
# 三次的启动时间
echo "首次安装时间(ms):$starttime1 $starttime2 $starttime3"
# 平均值
echo "($starttime1+$starttime2+$starttime3)/3" | bc
# The first installation time test is over, beginning warm boot test
quitApp
# 获取热启动的启动时间(同上,重复三次,取平均值)
starttime1=`getStartupTime ${component}`
quitApp
starttime2=`getStartupTime ${component}`
quitApp
starttime3=`getStartupTime ${component}`
quitApp
echo "热启动时间(ms):$starttime1 $starttime2 $starttime3"
echo "($starttime1+$starttime2+$starttime3)/3" | bc
# 获取冷启动的启动时间(同上,重复三次,取平均值)
clearApp ${package_name}
starttime1=`getStartupTime ${component}`
clearApp ${package_name}
starttime2=`getStartupTime ${component}`
clearApp ${package_name}
starttime3=`getStartupTime ${component}`
echo "冷启动时间(ms):$starttime1 $starttime2 $starttime3"
echo "($starttime1+$starttime2+$starttime3)/3" | bc
# 启动时间测试结束,卸载应用
uninstall ${package_name}
因为安卓手机的多样性,此脚本未做容错处理,部分手机在脚本运行过程中可能会弹出权限确认框或者其他界面,从而导致脚本运行失败。这个问题,大家可以根据自己手机的特性来做对应处理。
欢迎关注微信公众号“测试开发Stack”,更多原创文章第一时间发布!
Shell脚本 | 性能测试之启动时间的更多相关文章
- Shell脚本 | 性能测试之启动流量
安卓应用的流量统计有多种方式,点击「阅读原文」可以看到一篇别人写的文章,关于安卓流量数据的获取,写的挺全的,列举了几种不同方式的优劣.(见文末参考链接) 今天我要分享的是通过脚本一键获取应用的启动流量 ...
- Shell脚本 | 性能测试之内存
性能测试中,内存是一个不可或缺的方面.比如说在跑 Monkey 的过程中,如何准确持续的获取到内存数据就显得尤为重要. 今天分享一个脚本,可以在给定时间内持续监控内存,最后输出成一份 CSV 文件,通 ...
- Shell脚本 | 性能测试之CPU占有率
Android 是一个基于 Linux 内核的移动操作系统,Linux 的 CPU 占有率的计算方式也可以应用到 Android App 上. 今天分享的这个脚本的功能,是在多核情况下计算进程的 CP ...
- App性能测试之启动时间(安卓)手动+脚本
这个测试可以使用adb工具,adb的安装方式 测试策略 安装后首次启动 常规冷启动 热启动(一般这个都很少测试) 针对1和2的测试方法 步骤1:在cmd中输入如下命令 adb logcat * > ...
- Linux 性能监控之CPU&内存&I/O监控Shell脚本2
Linux 性能监控之CPU&内存&I/O监控Shell脚本2 by:授客 QQ:1033553122 思路: 捕获数据->停止捕获数据->提取数据 备注:一些命令的输 ...
- Linux 性能监控之CPU&内存&I/O监控Shell脚本1
Linux 性能监控之CPU&内存&I/O监控Shell脚本1 by:授客 QQ:1033553122 #!/bin/bash # 获取要监控的本地服务器IP地址 IP=`if ...
- 小白日记7:kali渗透测试之主动信息收集-发现(一)--二层发现:arping/shell脚本,Netdiscover,scapy
主动信息收集 被动信息收集可能不准确,可以用主动信息收集验证 特点:直接与目标系统交互通信,无法避免留下访问痕迹 解决方法:1.使用受控的第三方电脑进行探测,使用代理 (做好被封杀的准备) 2 ...
- Shell脚本分析服务器性能
概述 我们原先在服务器上想分析性能指标,需要执行一系列的linux命令.对于linux命令不熟悉的人来说,比较困难 现在有一套集成的shell脚本,把常用的linux命令都包含在里面,一键式分析性能瓶 ...
- linux下对服务器性能监控shell脚本
#!/bin/bash #提取本服务器的IP地址信息 ENO1=`ifconfig | sed -n '1,1p' | awk -F ' ' '{print $1}'` IP=` -d -d &quo ...
随机推荐
- C++调用ocx
1.保证ocx已正常注册,可以使用 2.创建一个C++的命令行程序,在主程序#import "HZ_KevinTest.ocx" no_namespace 生成一次程序,debug ...
- Linux 禁ping和开启ping操作
方法一: # echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 如果要恢复,只要: # echo 0 > /proc/sys/net ...
- MySQL查询实例
单表查询查询所有列 1 SELECT * FROM product; 查询指定列 1 SELECT pro_name,price,pinpai FROM product; 添加常量列 1 SELECT ...
- STL-容器库000
容器库已经作为class templates 实现. 容器库中是编程中常用的结构: (1)动态数组结构vector: (2)队列queue: (3)栈stack: (4)heaps 堆priority ...
- [leet code 198]House Robber
1 题目 You are a professional robber planning to rob houses along a street. Each house has a certain a ...
- 1*1卷积核在GoogleLeNet中的作用
1. 实现跨通道的交互和信息整合 1×1的卷积层(可能)引起人们的重视是在NIN的结构中,论文中林敏师兄的想法是利用MLP代替传统的线性卷积核,从而提高网络的表达能力.文中同时利用了跨通道poolin ...
- 2016CVPR论文集
http://www.cv-foundation.org/openaccess/CVPR2016.py ORAL SESSION Image Captioning and Question Answe ...
- MISL Learning
https://www.codeguru.com/csharp/.net/net_general/il/article.php/c4635/MSIL-Tutorial.htm http://etuto ...
- [转载]DevOps建立全生命周期管理
全生命周期管理(ALM)领域作为企业DevOps实践的总体支撑,应该说是DevOps领域中最为重要的实践领域,也是所有其他实践的基础设施.现在很多企业都非常重视CI/CD自动化工具的引入和推广,但是对 ...
- C# 子线程调用主线程窗体的解决方法
摘自其他人博客,自己试过确实解决问题.(如在自己定义的线程里面给textbox赋值) 由于Windows窗体控件本质上不是线程安全的.因此如果有两个或多个线程适度操作某一控件的状态(set value ...