性能常识 shell 脚本来实现应用冷启动 热启动的思路和脚本

wolfgao · 2019年04月14日 · 1794 次阅读

# 性能测试 ---- 冷启动测试

思路来源:

很多大公司是用高速摄像机来进行应用启动的响应时间测试,但是这个方法成本高,尤其是需要手工配合执行,如果对测试精度不是要求很严格的话,adb shell 提供了一种测量方法:
adb shell am start -W 包名/xxxActivity
这里一定要用-W,查询 help 的解释如下:-W: wait for launch to complete
下面我用抖音应用来示范一下:

adb shell am start -W com.ss.android.ugc.aweme/com.ss.android.ugc.aweme.main.MainActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.ss.android.ugc.aweme/.main.MainActivity }
Warning: Activity not started, its current task has been brought to the front
Status: ok
Activity: com.ss.android.ugc.aweme/.main.MainActivity
ThisTime: 464
TotalTime: 464
WaitTime: 520
Complete

正常情况下点击桌面图标只启动一个有界面的 Activity,此时 ThisTime=TotalTime。还有一种情况是点击桌面图标应用会先启动一个无界面的 Activity 做逻辑处理,接着又启动一个有界面的 Activity,在这种启动一连串 Activity 的情况下,displayStartTime 便指向最后一个 Activity 的开始启动时间点,mLaunchStartTime 指向第一个无界面 Activity 的开始启动时间点,此时 ThisTime !=TotalTime,或者说 TotalTime 包含了 ThisTime。这两种情况如下图:
单个activity启动和多个activity启动的启动原理

根据这个图如何来判断应用启动时间? 我们知道应用启动包括进程启动、走 Activity 生命周期。在第一次 onResume 时添加窗口到 WMS 中,然后 measure/layout/draw,窗口绘制完成后通知 WMS,WMS 在合适的时机控制界面开始显示 (夹杂了界面切换动画逻辑)。记住是窗口界面显示出来后,WMS 才调用 reportLaunchTimeLocked() 通知 AMS Activity 启动完成。

如果只关心某个应用自身启动耗时,参考 TotalTime;如果关心系统启动应用耗时,参考 WaitTime;如果关心应用有界面 Activity 启动耗时,参考 ThisTime。

关键脚本

废话少说,上脚本,下面是关键执行部分,目前只是冷起,如果是热起,在循环里面去掉 kill 的语句,替代成 press home 的语句。

#execute the loop
for((i=1; i<=$loops; i++));
do
adb shell am force-stop ${package}
sleep 5
adb shell am start -W ${package}"/"${activity} | grep TotalTime >> ${res}
sleep 2
# 打印“.”的个数来表示循环次数,比如"..."表示第3次循环  
#seq -s '.' $i |sed 's/[0-9]//g'
echo -e $i"\t\c"
done

计算数据,形成结果输出。

echo -e $package "的冷起最终结果如下:"
#awk -F : '{print $1, $2}' ${res}
awk -F , '{val=int($2); total+=val}END{print "总共冷起了" NR-1 "次,平均时间是:" total/(NR-1) " ms."}' ${res}

增加热启动部分:

function hot_start {
    #execute the loop
    for((i=1; i<=$loops; i++));
    do
        adb shell input keyevent KEYCODE_HOME >/dev/null 2>&1
        sleep 5
        adb shell am start -W ${package}"/"${activity} | grep TotalTime >> ${res}
        sleep 2
        echo -e $i"\t\c"
    done
}

全部源代码,请访问我的 github 地址:https://github.com/wolfgao/AndroidAuto/tree/master/performance

欢迎大家批评和指正!

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册