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 ...
随机推荐
- Ng第十二课:支持向量机(Support Vector Machines)(三)
11 SMO优化算法(Sequential minimal optimization) SMO算法由Microsoft Research的John C. Platt在1998年提出,并成为最快的二次规 ...
- Flash网页小游戏开发教程
架设服务器 地图 程序员
- 大道至简第一章和java理论学时第一节。感受。
这周上了本学期的第一节java课程.课件上说了一些学习java的基本思想.举了个“愚公移山”的例子.这可能就像刚接触一门新的语言,来练习输出“HelloWorld”一样,已成惯例. “愚公移山”的这个 ...
- sys/time.h 和 time.h
今天在燕麦工作第二天.看荣哥给我的程序,发现程序里面用的延时跟我以前使用的不同.导入两个头文件,然后用函数来获得时间.关于这个函数特别查来一下. time.h 是ISO C99 标准日期头文件. s ...
- POJ2594 Treasure Exploration(最小路径覆盖)
Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 8550 Accepted: 3 ...
- hihocoder 二分·二分答案【二分搜索,最大化最小值】 (bfs)
题目 这道题做了几个小时了都没有做出来,首先是题意搞了半天都没有弄懂,难道真的是因为我不打游戏所以连题都读不懂了? 反正今天是弄不懂了,过几天再来看看... 题意:一个人从1点出发到T点去打boss, ...
- 当有多个form表单请求时如何处理?
问题:当有多个表单请求时如何处理?两种获取form表单 name属性值来区分是哪一个form表单.问题:如何获取name的值呢?<form name="myForm" met ...
- spring默认为单例模式
这两天看到一个bug,记录下. 在获取任务的时候,本来任务不是由这个柜员领取的,但是最后跑到那个柜员下面去了. 查看日志,发现两个任务的领取操作很近,日志是穿插着打的. 后来经人指点,说spring初 ...
- [NewCode 5] 从尾到头打印链表
题目描述 输入一个链表,从尾到头打印链表每个节点的值. 题目比较水,一遍就 AC 了,来看代码: /** * struct ListNode { * int val; * struct ListNod ...
- ASP.NET微信公众号用于给指定OpenId用户发送红包
ASP.NET微信公众号用于给指定OpenId用户发送红包 微信公众号要实现对指定用户发送红包,必须指定一个存放兵发放金额的商户号,在微信商户平台里面申请商户号并获取相关参数例如发送红包所要用到的安全 ...