外观
如何使用 Perfetto 分析应用的主线程阻塞点?
标准回答
Perfetto 把线程何时运行、等待谁、执行多久画在同一条时间线上。先找到慢的区间,再追原因。
- 固定复现区间,定位对应启动或慢帧。
- 沿主线程切片、线程状态、Binder flow、RenderThread 和调度轨迹追踪。
- 修改后在相同条件下重复采样,确认关键路径缩短。
通俗例子
点击后主线程有 80ms 空档:看它是在运行 Java、等锁,还是等 Binder 返回。只有知道等待对象,才能选择搬线程、改锁或改调用。
深入解释
**先判断线程处于什么状态:**Running 表示正在占用 CPU;Runnable 通常表示可运行但还没得到 CPU;睡眠或阻塞则可能是在等消息、锁或其他服务。长时间没运行不必然是代码算得慢。
**再沿证据追原因:**若主线程卡在同步 Binder 调用,就查看服务端对应处理;若等锁,就找持锁线程。最后用同一操作复采 Trace,验证修改确实缩短了关键等待。
易混淆点
切片很长不一定代表 CPU 很忙;Runnable 但没运行可能是调度竞争。
参考资料
内容来源
- Android · AI Agent 知识手册 · 原条目
3.5.1