第1章 启动速度定义与度量标准
1.1 启动类型与核心概念
应用启动速度是用户体验的第一门槛。根据进程与缓存状态不同,划分为三种启动方式:
- 冷启动(Cold Start):进程完全不存在,系统从零创建进程、加载类、初始化资源。耗时最长,是优化的主要目标。
- 温启动(Warm Start):进程存在但 Activity 被销毁,只需重建 Activity 及部分缓存。耗时介于冷/热之间。
- 热启动(Hot Start):进程和 Activity 均在后台存活,仅需切换到前台。耗时最短,< 100ms 可接受。
优化原则:热启动通常无需干预;温启动优化重点在 Activity 重建路径;冷启动需关注进程创建、ContentProvider 初始化、首屏渲染全链路。
| 启动类型 | 进程状态 | Activity 状态 | 典型耗时 | 优化优先级 |
|---|---|---|---|---|
| 冷启动 | 不存在 | 未创建 | 2~20s | ★★★★★ |
| 温启动 | 存在 | 已销毁 | 1~5s | ★★★★ |
| 热启动 | 存在 | 存活(后台) | 0.1~1s | ★★ |
1.2 关键度量指标
业界通常使用以下三项指标量化启动速度:
- T0(进程创建时间):从用户点击图标到
Application.onCreate()执行完毕的时间戳。反映系统调度与初始化开销。 - TTI(Time to Interactive):从点击到首帧可交互的时间。标准为
reportFullyDrawn()或首帧渲染 + 主线程空闲。 - FPS(首帧帧率):启动过程中每帧的渲染耗时,用于检测掉帧/卡顿。理想值 ≥30fps,目标 ≥60fps。
常见误区:T0 只反映 Application 及 ContentProvider 初始化,不代表界面就绪;TTI 才是用户真正感知的“可用”时刻。两者差距过大说明主线程阻塞严重。
计算示例(adb 获取冷启动 TTI)
# 获取冷启动耗时(包含进程创建 + 首帧渲染)
adb shell am start -W -n com.example.app/.MainActivity | grep TotalTime
# 输出示例:TotalTime: 5820
1.3 工具选型与使用方式
| 工具 | 平台 | 获取指标 | 核心命令/API |
|---|---|---|---|
| adb | Android | T0, TTI, 进程创建耗时 | adb shell am start -W |
| Android Profiler | Android | CPU/内存/网络、帧渲染、启动追踪 | 内置分析器,支持 systrace/perfetto |
| Instruments | iOS | App Launch 模板,获取 TTI、帧率、系统调用 | Xcode → Open Developer Tool → Instruments |
adb 进阶用法:延迟日志输出可解析更多细节
# 输出完整启动日志(含 Application 初始化时间)
adb logcat -c && adb logcat -s ActivityManager:I &
adb shell am start -n com.example.app/.MainActivity
# 在日志中搜索 "Displayed com.example.app/.MainActivity + 1s 234ms"
实战建议:多次冷启动取中位数(5~10次),避免缓存波动。结合
reportFullyDrawn() 标注 TTI 终点。
1.4 常见错误与度量陷阱
- 只测一次忽略方差:冷启动受后台任务、GC、CPU 调度影响,单次数据不可靠,至少取 5 次中位数。
- 混淆 Displayed 时间与 TTI:Displayed 只代表首帧绘制完成,不等于可交互。需配合
reportFullyDrawn()或自定义埋点。 - 热启动未清缓存:测量温/热启动前需确认 Activity 已按规范销毁或保留,否则结果失真。
- 工具选型不当:仅用 adb 无法看到渲染管线细节;仅用 Profiler 可能遗漏进程创建阶段。
# 正确测量冷启动流程(Android 示例)
adb shell am force-stop com.example.app
sleep 2
adb shell am start -W -n com.example.app/.MainActivity | grep TotalTime
# 重复 5 次,取中位数
iOS 实战补充:使用 Instruments 的 App Launch 模板时,需在真机上勾选“Wait for executable to be launched”以捕捉完整的进程创建阶段。