编写脚本统计Android APP冷启动时间
Posted 周文凯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写脚本统计Android APP冷启动时间相关的知识,希望对你有一定的参考价值。
转载请标明出处:
https://blog.csdn.net/xuehuayous/article/details/86236142;
本文出自:【Kevin.zhou的博客】
最近准备做下APP的性能优化,首先肯定是要全面了解下APP的性能状况,第一个想到的就是APP的启动速度。自家的和别人的有多少差距呢?
我们知道可以通过adb
命令查看启动时间,比如查看微信的:
$ adb shell am start -W -n com.tencent.mm/.ui.LauncherUI
Starting: Intent cmp=com.tencent.mm/.ui.LauncherUI
Warning: Activity not started, its current task has been brought to the front
Status: ok
Activity: com.tencent.mm/.ui.LauncherUI
ThisTime: 94
TotalTime: 94
WaitTime: 105
Complete
竟然这么快,不合常理,先通过adb
把APP彻底干死再统计下:
$ adb shell am force-stop com.tencent.mm
$ adb shell am start -W -n com.tencent.mm/.ui.LauncherUI
Starting: Intent cmp=com.tencent.mm/.ui.LauncherUI
Status: ok
Activity: com.tencent.mm/.app.WeChatSplashActivity
ThisTime: 188
TotalTime: 1371
WaitTime: 1389
Complete
很明显,一次的数据尽管趋于真实也是存在很大的偶然性。大家肯定想到了统计多次取平局数,比如取100次,在命令行里搞100次上面两个命令,然后把每次的时间加起来再除以100,想想这个工作量就头大,程序员肯定不能这么做事情。能不能写个脚本,一个回车就搞定呢?
编写脚本
那就编写一个shell
脚本吧:
#!/bin/bash
# 检查连接的设备
function checkDevice()
# 获取连接的设备信息
adb devices > .temp
device_count=`grep -o ' device' .temp |wc -l`
if [[ $device_count -eq 0 ]]; then
echo "没有已连接的设备,等待设备连接!"
# 等待设备连接
adb wait-for-device
fi
# 设备信息
function deviceInfo()
device_manufacturer=`adb shell getprop ro.product.manufacturer`
device_model=`adb shell getprop ro.product.model`
android_version=`adb shell getprop ro.build.version.release`
echo "设备信息: $device_manufacturer $device_model Android $android_version"
# 获取冷启动时间
function getStartUpTime()
# 关闭APP
adb shell am force-stop $pkg
# 启动APP
adb shell am start -W -n $pkg/$cls > .temp
# 读取日志获取启动时间
cat .temp | while read line; do
name=`echo $line|awk -F ':' 'print $1'`
if [[ $name == "TotalTime" ]]; then
value=`echo $line|awk -F ': ' 'print $2'`
# echo $value 部分手机为 xxx\\r, 只取数字
trim=`echo "$value" | tr -cd "[0-9]"`
echo $trim
fi
done
# 删除临时文件
function clear()
rm -rf .temp
# ---------------------------------------------------------------
# 微信
pkg=com.tencent.mm
cls=.ui.LauncherUI
# 循环次数
times=10
if [[ $# = 2 ]]; then
pkg=$1
cls=$2
elif [[ $# == 3 ]]; then
pkg=$1
cls=$2
times=$3
else
echo "请输入至少两个参数(包名 Activity 次数(默认10)), 如下所示: "
echo "./startup_time.sh com.tencent.mm .ui.LauncherUI 10"
exit
fi
# 检查连接的设备
checkDevice
# 设备信息
deviceInfo
# 总时间
totalTimes=0
# 循环times次
for ((i=1; i<=$times; i ++))
do
start_up_time=$(getStartUpTime)
# 如果没有启动时间信息,简单粗暴提示Activity不存在
if [[ $start_up_time == "" ]]; then
echo "Activity $pkg/$cls 不存在! "
# 删除临时文件
clear
exit
fi
totalTimes=`expr $totalTimes + $start_up_time`
echo "第$i次冷启动耗时: $start_up_time ms"
done
echo "总耗时: $totalTimes ms, 平均耗时: `expr $totalTimes / $times` ms"
# 删除临时文件
clear
使用
-
把脚本代码保存到本地文件
./startup_time.sh
; -
更改脚本为可执行权限;
chmod +x startup_time.sh
-
启动脚本,以微信为例,统计10次。
有三个参数,参数之间使用空格隔开,第一个未APP包名,第一个为Activity名称,第三个为统计次数。./startup_time.sh APP包名 Activity名称 次数
如果Activiy在包名下,可以省略签名的包名。如:
com.tencent.mm.ui.LauncherUI
可以省略写为.ui.LauncherUI
。$ ./startup_time.sh com.tencent.mm .ui.LauncherUI 10 设备信息: Xiaomi MIX 2 Android 8.0.0 第1次冷启动耗时: 1176 ms 第2次冷启动耗时: 1485 ms 第3次冷启动耗时: 1452 ms 第4次冷启动耗时: 1227 ms 第5次冷启动耗时: 1205 ms 第6次冷启动耗时: 1218 ms 第7次冷启动耗时: 1210 ms 第8次冷启动耗时: 1402 ms 第9次冷启动耗时: 1224 ms 第10次冷启动耗时: 1224 ms 总耗时: 12823 ms, 平均耗时: 1282 ms
是不是开心到飞起呢~~~
以上是关于编写脚本统计Android APP冷启动时间的主要内容,如果未能解决你的问题,请参考以下文章