性能与稳定性全景:一次故障如何变成可验证的时间线
2026/8/9大约 3 分钟性能与稳定性Android 14性能稳定性排障
性能与稳定性全景:一次故障如何变成可验证的时间线
“卡了”“启动慢”“偶尔闪退”都只是现象。工程定位要先固定复现窗口,再把日志事件、线程 调度、帧时间和现场文件对齐到同一时间轴,最后指出具体线程在具体阶段等待了什么。
先把现象还原成时间线
| 常见误解 | 正确理解 |
|---|---|
| 性能问题靠“感觉卡”来定位 | 卡是结果,要用时间线找出卡在哪个线程、哪个阶段 |
| ANR、崩溃、卡顿是三套独立知识 | 它们共享同一套“时间线 + 证据”方法,只是现象不同 |
| logcat 就是全部证据 | logcat 只给线索,帧时间、线程调度、堆栈才是根因证据 |
核心结论
- 统一方法:现象 → 分类 → 抓时间线 → 找卡点线程 → 定位根因 → 修复回归。
- 四类高频现象:ANR(超时)、卡顿(帧超预算)、崩溃(异常/信号)、OOM(资源耗尽)。
- 时间线工具以 Perfetto 为主,配合 logcat、dumpsys 与堆栈文件交叉验证。
- 主线程卡顿是万恶之源:UI 线程超时/阻塞会同时表现为卡顿、ANR 甚至崩溃。
- 排查顺序固定:先确认现象与复现,再抓证据,最后改代码。
故障分类地图
逐步解释:
- 分类:先确定是超时、掉帧、崩溃还是资源耗尽。
- 还原:用时间线把故障前后的线程状态、帧时间、事件串起来。
- 找根因:卡点通常在主线程、锁竞争、调度延迟或内存回收。
- 修复回归:改完必须回到同一场景复现验证。
本专题的分工
- Perfetto 时间线:抓取与阅读 trace,是所有分析的基础。
- ANR 全类型:输入、广播、服务的超时语义。
- 卡顿与帧时间线:帧预算与掉帧定位。
- 冷启动优化:从点击图标到首帧的主链。
- CPU 与线程问题:负载、锁与调度。
- 崩溃与稳定性:tombstone、信号与恢复。
- 性能排障:统一检查链。
验证与排障
环境:开发设备或模拟器;抓 trace 需要允许开发者选项。
adb shell perfetto -o /data/misc/perfetto-traces/trace.perfetto-trace \
-t 10s sched freq idle atrace am wm view input
adb logcat -v threadtime -d | tail -200先用 logcat 找现象时间点,再用 Perfetto 还原该时间点前后的线程调度。抓 trace 前 先复现问题,并记录复现时间点,否则 trace 会错过故障现场。
源码入口
| 文件 | 关键位置 | 作用 |
|---|---|---|
ActivityManagerService.java | 超时与 ANR | 系统等待语义 |
InputDispatcher.cpp | 输入超时 | 输入 ANR |
Choreographer.java | VSync 回调 | 帧调度 |
FrameTimeline | 帧时间线 | 掉帧判定 |
公共路径:frameworks/base/services/core/java/com/android/server/am/、 frameworks/base/core/java/android/view/ 与 frameworks/base/services/inputflinger/dispatcher/。行号以 r75 检索为准。
需要把现象还原为线程时间线时,见 Perfetto 时间线。