Application 的构造器方法——>attachBaseContext()——>onCreate()——>Activity 的构造方法——>onCreate()——>配置主题中背景等属性——>onStart()——>onResume()——>测量布局绘制显示在界面上。
在上面这个启动流程中,任何一个地方有耗时操作都会拖慢我们应用的启动速度,而应用启动时间是用毫秒度量的,对于毫秒级别的快慢度量我们还是需要去精确的测量到到底应用启动花了多少时间,而根据这个时间来做衡量。
什么才是应用的启动时间
从点击应用的启动图标开始创建出一个新的进程直到我们看到了界面的第一帧,这段时间就是应用的启动时间。
我们要测量的也就是这段时间,测量这段时间可以通过 adb shell 命令的方式进行测量,这种方法测量的最为精确,命令在下面的原理里面。
adb shell am start -W [packageName]/[packageName.MainActivity]
针对冷启动时候的一些耗时,如上测得这个应用算是中型的 app,在冷启动的时候耗时已经快 700ms 了,如果项目再大点在 Application 中配置了更多的初始化操作,这样将可能达到 1s,这样每次启动都明显感觉延迟,所以在进行应用初始化的时候采取以下策略:
遵循上面三种策略可明显提高 app 启动速度。
用 shell 脚本写的比较简单的算法,具体跑的时间可以自己设置,个人以为 5 次左右就够了。下面是首次安装启动的代码,冷启动,热启动就不赘述了。
firstLaunch(){
echo "start first launch 3 times"
for i in {1..3}
do
echo "-----第 $i 次首次启动测试-----"
uninsallApp
installApp
TotalTime[i]=`adb shell am start -W $PackageName/$ActivityName |grep TotalTime|awk -F ' ' '{print $2}'|tr -d "\r"`
sleep 3s
echo ${TotalTime[i]}
done
max=0
for n in "${TotalTime[@]}"
do
((n>max)) && max=$n
done
echo "热启动峰值:$max ms"
avg=0
sum=$((${TotalTime[1]} + ${TotalTime[2]} + ${TotalTime[3]}))
avg=$[$sum/3]
echo "热启动均值:$avg ms"
}
installApp(){
echo "----重新安装被测APP $PackageName ----"
apps_dir=$(pwd)
echo $apps_dir
adb install $apps_dir/$PackageName.apk
}
uninsallApp(){
echo "-----开始卸载被测App $PackageName-----"
adb uninstall $PackageName
}
echo -n "请输入被测包名:"
read PackageName
echo -n "请输入启动Activity:"
read ActivityName
echo -e "-----请输入测试类型:----- \n 冷启动测试输入1 \n 热启动测试输入2 \n 首次安装启动时间输入3"
read testType
if [[ $testType -eq 1 ]]; then
echo "-----冷启动测试-----"
coldLaunch
elif [[ $testType -eq 2 ]]; then
echo "-----热启动测试-----"
warmLaunch
elif [[ $testType -eq 3 ]]; then
echo "-----首次安装启动测试-----"
firstLaunch
else
ERROR "测试Tpye输入错误"
fi
echo "----测试结束----"
有什么其他好的测试方法 我们也可以一起交流交流