应用首帧耗时和应用冷启动时间

应用首帧耗时和应用冷启动时间,是两个相关但不同的指标。

应用首帧耗时(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 → 首帧绘制

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器