编写脚本统计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

使用

  1. 把脚本代码保存到本地文件./startup_time.sh

  2. 更改脚本为可执行权限;

    chmod +x startup_time.sh
    
  3. 启动脚本,以微信为例,统计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)