策略:
关于app的启动时间测试,主要关注以下三种场景:
- 1 首次启动:应用首次启动(冷启动)所花费的时间
- 2 非首次启动:应用非首次启动(热启动)所花费的时间
- 3 应用界面切换:应用界面内切换所花费的时间
测试方法:
方法一:
通过监控logcat中的 ActivityManager 的相关数据。
1 打开ddms,设置过滤条件:
设置“by Log Tag”为:ActivityManager
2 打开相关app,然后就能在log中打印的Displayed的信息,根据应用名称记录启动时间数据。
图中指出的就是进入 packageName/activityName 的时间
3 有些应用启动会经历2个阶段,如先进入指引页,再进入主页,那么启动时间位累加2个display打印的时间值。具体根据实际测试中选择的策略
方法二:
通过adb命令: adb shell am start -W -n packageName/activityName
1 首先获得当前界面包名和类名:
adb shell dumpsys activity | grep mFocusedActivity
2 然后使用adb命令获取“ThisTime”的值就可以了。(这里的TotalTime是指将activity从activity栈中取出的总时间)
注意:这个方法在某些手机上需要root权限
结果对比:
通过对比,可以发现两种方法获取的时间是一样的,因为am是ActivityManager的缩写,两种方法的底层实现是一样的。
不过,am start方法如果this time大于10s,就会显示time out,而logical里面能显示正常的时间:
原理:
那么这个时间到底是怎么得来的,这里先讲下activity的生命周期:
一个activity真正开始运行,会先经过三个方法:onCreate(),onStart(),onResume()。
那么我们写个demo app,并建立这三个方法(打印三个方法的名称,并打印执行方法的时间戳
)
打开app就可以看到log中将三个方法的执行时间戳打印出来,并能看到ActivityManager的启动时间
差不多就是onCreate到onResume的时间。那么我们在onResume方法中延迟2s,验证一下结果:
log:
这次很清楚了,onResume方法这次执行了2s多,并且在打印出end的时间戳后,display给出了activity的启动时间。
说明,am start 的启动时间给出的是activity的onCreate方法开始执行 到 onResume方法执行结束的时间。也就是说,是activity完全启动的时间。