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 ...
随机推荐
- 第70讲:Scala界面GUI编程实战详解
今天又学习了王家林老师的scala学习讲座第70讲,关于scala的界面编程,让我们来初步学习一下scala中界面编程的过程. 信息来源于 DT大数据梦工厂微信公众账号:DT_Spark 关注微信账号 ...
- 7.Layout布局(tabs、accordion、layout)
一.tabs选项卡: 二.accordion手风琴: 三.经由div标记创建layout布局: 注意:center不是定位得到的,而是通过其他的几个位置计算得到的,如果不写center整个布局就无法初 ...
- HDU 2476 区间DP-刷字符问题-思维考察
区间DP-刷字符问题-思维考察 翻译了一下这个题,一看还是有点难以入手,标明了是区间DP问题,但是如何DP呢 来捋一捋思路吧 dp[i][j]肯定是从i刷到j所要的次数但是它的i和j是s1串还是s2串 ...
- 编写高质量iOS与OS X代码的52个有效方法
第一章重点: 第一条:OC的起源 OC由smalltalk语言演化而来的语言为消息结构(messaging structure)语言,其运行时所因执行的的代码由运行环境来决定:函数调用(functio ...
- EBS中 EXCEL 格式报表输出的公用API
http://blog.itpub.net/10359218/viewspace-752601/ 最近的项目上写了一个公用的API,很久以前就用EXCEL发布过报表,但从没想过写API来简化... ...
- EBS环境提交新请求默认是"单一请求"
http://blog.csdn.net/samt007/article/details/38304239 用过EBS的请求都知道,提交一个新报表都要点好几个按钮,其中一个很麻烦的就是选择提交新请求的 ...
- Android-Java-面向对象与面向过程的简单理解
支持面向过程的语言有:C Basic 等语言: 支持面向对象的语言有:C++ Java C# 等语言: 面向过程:操作的是行为/功能: 面向对象:操作的是对象,而对象里面有功能行为,所以可以指定 ...
- 分形之谢尔宾斯基(Sierpinski)四面体
前面讲了谢尔宾斯基三角形,这一节的将对二维三角形扩展到三维,变成四面体.即将一个正四面体不停地拆分,每个正四面体可以拆分成四个小号的正四面体.由二维转变到三维实现起来麻烦了许多.三维的谢尔宾斯基四面体 ...
- <string.h>的学习
感觉学习代码库最好的方法就是运行一下. 下面附上结果和示例代码 #include <stdio.h> #include <string.h> int main(){ const ...
- C#之简易计算器设计
在学完了C#的方法和数据类型之后,写了一个简易的计算器的界面.本次界面具备加减乘除求余等五项运算.不过存在一点缺陷就是无法判断输入数据的类型,是整数还是小数,由于目前所学知识有限,等学到以后再进行完善 ...