安卓应用的性能测试,通常包括六个指标:启动时间、内存、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脚本 | 性能测试之启动时间的更多相关文章

  1. Shell脚本 | 性能测试之启动流量

    安卓应用的流量统计有多种方式,点击「阅读原文」可以看到一篇别人写的文章,关于安卓流量数据的获取,写的挺全的,列举了几种不同方式的优劣.(见文末参考链接) 今天我要分享的是通过脚本一键获取应用的启动流量 ...

  2. Shell脚本 | 性能测试之内存

    性能测试中,内存是一个不可或缺的方面.比如说在跑 Monkey 的过程中,如何准确持续的获取到内存数据就显得尤为重要. 今天分享一个脚本,可以在给定时间内持续监控内存,最后输出成一份 CSV 文件,通 ...

  3. Shell脚本 | 性能测试之CPU占有率

    Android 是一个基于 Linux 内核的移动操作系统,Linux 的 CPU 占有率的计算方式也可以应用到 Android App 上. 今天分享的这个脚本的功能,是在多核情况下计算进程的 CP ...

  4. App性能测试之启动时间(安卓)手动+脚本

    这个测试可以使用adb工具,adb的安装方式 测试策略 安装后首次启动 常规冷启动 热启动(一般这个都很少测试) 针对1和2的测试方法 步骤1:在cmd中输入如下命令 adb logcat * > ...

  5. Linux 性能监控之CPU&内存&I/O监控Shell脚本2

    Linux 性能监控之CPU&内存&I/O监控Shell脚本2   by:授客 QQ:1033553122 思路: 捕获数据->停止捕获数据->提取数据 备注:一些命令的输 ...

  6. Linux 性能监控之CPU&内存&I/O监控Shell脚本1

    Linux 性能监控之CPU&内存&I/O监控Shell脚本1   by:授客 QQ:1033553122   #!/bin/bash # 获取要监控的本地服务器IP地址 IP=`if ...

  7. 小白日记7:kali渗透测试之主动信息收集-发现(一)--二层发现:arping/shell脚本,Netdiscover,scapy

    主动信息收集 被动信息收集可能不准确,可以用主动信息收集验证   特点:直接与目标系统交互通信,无法避免留下访问痕迹 解决方法:1.使用受控的第三方电脑进行探测,使用代理 (做好被封杀的准备)   2 ...

  8. Shell脚本分析服务器性能

    概述 我们原先在服务器上想分析性能指标,需要执行一系列的linux命令.对于linux命令不熟悉的人来说,比较困难 现在有一套集成的shell脚本,把常用的linux命令都包含在里面,一键式分析性能瓶 ...

  9. linux下对服务器性能监控shell脚本

    #!/bin/bash #提取本服务器的IP地址信息 ENO1=`ifconfig | sed -n '1,1p' | awk -F ' ' '{print $1}'` IP=` -d -d &quo ...

随机推荐

  1. 理解shell的eval命令

    看以下两条命令:[zhangsan@XEN /sys]$ a="ls";b="\$a";c="$b";"$c"Hey! ...

  2. Learning Emacs

    一.退出和缩小emacs C-x C-c C-z 二.打开和关闭文件 C-x C-f C-x C-c 三.移动 C-b 后退 C-p 向上 C-n 向下 C-f 向前

  3. Leetcode-448. Find All Numbers Disappeared in an Array(solve without extra space easy)

    Given an array of integers where 1 ≤ a[i] ≤ n (n= size of array), some elements appear twice and oth ...

  4. HDU2844买表——多重背包初探

    HDU2844买表多重背包问题题目大意都不大好懂,是利用手头上的硬币看看能组合出多少种价格,也就是跑完背包,看看有多少背包符合要求 剩下的就是多重背包的问题了1.第一个处理办法就是直接当01背包进行存 ...

  5. myeclipse6.6+maven跑springside4.1的demo

    1.安装myeclipse6.6 2.myeclipse6.6安装maven 2.1 删除原有maven. 关闭Eclipse程序, 进入MyEclipse插件目录/eclipse/features ...

  6. Android-Java-引用数据类型参数传递内存图

    首先看一个案例: package android.java.oop04; class Person { public String name; public void showName() { Sys ...

  7. Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again 问题分析

    Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again Loaded pl ...

  8. [NewCoder 7] 用两个栈实现队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 水题,直接上代码: class Solution { public: void push(int nod ...

  9. CAS Ticket票据:TGT、ST、PGT、PT、PGTIOU

    CAS的核心就是其Ticket,及其在Ticket之上的一系列处理操作.CAS的主要票据有TGT.ST.PGT.PGTIOU.PT,其中TGT.ST是CAS1.0协议中就有的票据,PGT.PGTIOU ...

  10. Python学习--和 Oracle 交互(2)

    当在 mac 电脑上用 Python 读取 oracle 数据库中的中文时,有可能返回数据为“?” 解决方案: 在数据库操作的函数前添加以下代码, import sysreload(sys)sys.s ...