转载请标明出处:
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
是不是开心到飞起呢~~~