启动时间测量方式
获取启动时间的方式
方式一:adb
命令
adb shell am start -W packagename/首屏Activity
ThisTime
:最后一个Activity
启动耗时TotalTime
:所有Activity
启动耗时WaitTime
:AMS启动Activity
的总耗时
特点:
- 线下使用方便,不能带到线上
- 非严谨、精确时间
方式二:实验室监控:视频录制
通过高速摄像头录制app启动过程,然后计算启动消耗帧率
有条件的还可以使用图像识别技术实现自动化
方式三:手动打点
启动时埋点,启动结束买点,二者差值
1 | // 手动打点记录相关类 |
开始打点:在Application
的attachBaseContext
方法里打点,这里是app所能收到的最早回调时间
1 | // Application |
结束打点:
- 误区:在
onWindowFocusChanged
里打点,这里只是首帧时间,用户未必可以交互 - 正解:在界面的真实数据展示里的UI进行打点,如列表的第一条数据、可交互控件的显示等
要在必要的可交互View中进行结束打点,如下操作
1 | view.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawListener() { |
特点:
- 精确,可带到线上,并能将记录到的时间上传至后台,推荐使用
启动类型监控
- 首次安装启动(由于有
dex
优化的过程,首次安装刚开始可能内存和代码执行效率不是很高) - 覆盖安装启动(由于有
dex
优化的过程,覆盖安装刚开始可能内存和代码执行效率不是很高) - 冷启动(指标)
- 热启动(可以反映程序的保活能力)
扩展:
启动结束时机
是否时以用户真正可以操作的时间作为启动结束的时间
启动时间扣除逻辑
闪屏、广告和引导页消耗的时间应该从启动时间里扣除
启动排除逻辑
对于
Broadcast
、Server
拉起进程,但是没有启动Activity
需要排除统计