Systrace 分析核心是用 Chrome 打开 trace.html,通过线程颜色状态(绿/蓝/白/橙/紫)定位主线程阻塞、帧超时(>16ms)及 IPC/IO 等待,结合调用栈锁定代码瓶颈。
核心分析流程
生成数据:连接设备开启 USB 调试,执行
python systrace.py --time=N -o trace.html [categories](常用类别:sched gfx view wm input binder),复现卡顿场景后回车停止 。加载视图:Chrome 访问
chrome://tracing/点击 Load 导入 html 文件,或使用新版 Android Studio Profiler 直接查看 。定位瓶颈:聚焦主线程(UI Thread),查找长耗时色块、红色掉帧标记及非绿色状态区间 。
下钻归因:点击色块查看调用栈(Call Stack),确认是业务逻辑、锁竞争、IO 还是 Binder 通信导致 。
关键指标与颜色解读
绿色 (Running):线程正在 CPU 执行。若单段过长(>16ms)说明计算繁重或主线程阻塞 。
蓝色 (Runnable):线程就绪但未获调度,持续过长表明 CPU 满载或优先级被挤占 。
白色 (Sleeping):线程休眠(通常等锁或事件),正常;若频繁切换需检查锁机制 。
橙色 (Uninterruptible Sleep):IO 阻塞(如磁盘读写),底部常标有
wait_on_page_locked,是卡顿常见因 。紫色 (Interruptible Sleep):内核态等待(如内存管理),需结合具体场景判断 。
帧时间轴:顶部 Rendering 栏中,绿色圆点≤16.6ms,红/黄点>16.6ms即为掉帧(Jank)。
高效操作技巧
快捷键:
W/S缩放时间轴,A/D平移,M高亮选中段及其边界,1/2/3/4切换选择/平移/缩放/计时模式 。唤醒分析:查看蓝色等待段上方,确认谁唤醒了该线程,追踪跨进程(如 App 等待 SystemServer AMS)调用链 。
自定义标记:代码中插入
Trace.beginSection("MethodName")/endSection(),在报告中精准定位具体函数耗时 。
常见场景排查方向
启动慢:检查
ActivityThread生命周期、Zygotefork 耗时、SurfaceFlinger首次合成时间 。滑动卡顿:观察
Choreographer#doFrame是否超时,主线程是否存在大量traversal、measure、layout或draw堆积,RenderThread 是否阻塞 。点击无响应:排查
Input事件分发延迟,主线程是否被长 IO(橙色)或死锁(白色长条)占用 。
注意:Android 10+ 建议使用 debug.atrace.tags.enableflags=0x1FFF 获取完整标签;若工具链缺失,可从 Android SDK platform-tools/systrace/ 获取或改用 Android Studio 内置 CPU Profiler 。
https://source.android.com/docs/core/tests/debug/systrace?hl=zh-cn