应用首帧耗时和应用冷启动时间
应用首帧耗时和应用冷启动时间,是两个相关但不同的指标。
应用首帧耗时(Time to First Frame)
定义:
从系统启动应用进程(冷启动)开始,到用户“看到首个 Activity 的第一帧完成渲染”为止的时间。
特点:
- 这是用户感知到界面出现的时间;
- 强调**“UI 可见”**这个节点;
- 一般在 Activity.onWindowFocusChanged() + Choreographer.postFrameCallback 中采集;
- 是 Google Play 和 Firebase Performance 重点推荐的启动指标之一。
应用冷启动时间(Cold Start Time)
定义:
从系统启动应用(点击图标)开始,到 Activity.onResume() 被调用为止的时间。
特点:
- 是系统层面常用的启动阶段划分(ActivityManagerService 中也这么统计);
- 不考虑 UI 是否绘制完成;
- 通常用于系统 trace 中衡量冷启动性能。
二者对比总结表
项目 | 应用首帧耗时 | 应用冷启动时间 |
---|---|---|
起始点 | Zygote fork app 进程(系统启动 app) | 同上 |
终止点 | 首帧绘制完成(Choreographer 回调) | Activity.onResume() |
是否包含 UI 绘制 | ✅ 包含首帧绘制时间 | ❌ 不包含 |
是否代表用户感知 | ✅ 代表“用户真正看到界面” | ❌ 用户可能还没看到界面 |
是否推荐采集 | ✅ 更准确反映体验 | ✅ 系统 trace 中默认采集 |
一般时长(冷启动) | 1000ms - 3000ms | 600ms - 2000ms |
举个例子(真实场景)
假设用户点击图标启动 App:
阶段 | 时间 | 说明 |
---|---|---|
0ms | 应用进程被创建 | |
100ms | Application.onCreate() | |
300ms | Activity.onCreate() | |
600ms | Activity.onResume() (✅ 冷启动时间统计结束) | |
1000ms | Activity.onWindowFocusChanged() | |
1200ms | 首帧绘制完成(✅ 首帧耗时统计结束) |
此时:
- 冷启动时间:600ms
- 首帧耗时:1200ms
哪个更重要?
- 冷启动时间是系统调度层面的核心指标;
- 首帧耗时才是用户体验层面的关键指标(用户真正看到界面);
- Google 在 Android Vitals(性能指标)中优先关注 Time to Full Display / Time to First Frame。
最佳实践建议
目标 | 推荐指标 |
---|---|
用户体验评估 | 首帧耗时 |
系统调度分析 | 冷启动耗时 |
调优方向判断 | 二者都采集 |
你也可以打组合指标,比如:
冷启动耗时:App attachBaseContext → Activity.onResume()
首帧耗时:App attachBaseContext → Choreographer.postFrameCallback
布局耗时:Activity.onCreate → onResume
UI绘制耗时:onWindowFocus → 首帧绘制