perfetto是android系统级全链路追踪核心工具,集system tracing、命令行工具与web ui于一体,支持跨进程、多层级(应用线程/surfaceflinger/kernel/gpu)毫秒级时序分析,替代systrace并提供sql分析与离线可视化能力。

进程分析工具链不是堆一堆命令的集合,而是围绕“问题在哪、为什么卡、怎么改”形成的闭环能力。真正有效的全链路分析,关键在于按场景选工具、分层次看数据、跨组件对时间线。
从单进程到跨进程:分层定位卡点
单个进程卡死,优先用 pstack 快速抓线程栈,尤其适合排查死锁或阻塞等待(比如 pthread_cond_timedwait 长时间挂起);如果怀疑是系统级调度或 I/O 争抢,就得上 perfetto——它能同时捕获应用线程、SurfaceFlinger、kernel sched、GPU 等多层 trace,10 秒录制就能看清卡顿是否来自 SurfaceFlinger 渲染延迟或 binder 调用堆积。
- 冷启动慢?用
adb shell am start-activity -W抓 TotalTime,再配合 perfetto 看 Activity 启动路径中哪一环耗时异常 - 后台服务响应迟钝?用
adb shell dumpsys batterystats结合 Battery Historian 分析唤醒频次与 CPU 持续运行时长 - 多进程协作异常?Perfetto 的跨进程 timeline 可直接标出 A 进程发 binder、B 进程收消息、C 进程回调之间的毫秒级间隔
内存与泄漏:不止看堆大小
内存问题不能只盯着 heap size。Android Studio Profiler 自带的 Activity/Fragment 泄漏自动识别功能,开 GC 后红色标记就是活对象残留,比手动 dump heap 快得多;更隐蔽的泄漏(如 Handler 持有 Activity 引用),LeakCanary 2.9+ 会直接给出完整引用链,连匿名内部类的 this
内存问题不能只盯着 heap size。Android Studio Profiler 自带的 Activity/Fragment 泄漏自动识别功能,开 GC 后红色标记就是活对象残留,比手动 dump heap 快得多;更隐蔽的泄漏(如 Handler 持有 Activity 引用),LeakCanary 2.9+ 会直接给出完整引用链,连匿名内部类的 this$0 都标得清清楚楚。
都标得清清楚楚。- Native 内存增长快?用
adb shell dumpsys meminfo -d <package></package>查 PSS 与 Native Heap 对比 - 怀疑 mmap 或 ashmem 泄漏?结合
adb shell cat /proc/<pid>/maps</pid>和adb shell procrank定位大块匿名内存归属 - Java 对象生命周期混乱?Memory Profiler 的 Allocation Tracker 可按类名过滤,实时看 new 实例频率和存活时长
功耗与调度:把“省电”变成可量化指标
用户说“手机发热掉电快”,背后可能是 Wakelock 滥用、频繁 JobScheduler 唤醒,或是 RenderThread 持续高负载。Battery Historian 不只是看图表,重点要读三类数据:Wake Lock 持续时间、Process State(R/S/D 状态占比)、以及 Kernel Wake Reason(比如某个 sensor hub 驱动不断触发中断)。
- 发现某服务 wake lock 时间异常?用
adb shell dumpsys alarm查 pending alarm 和 broadcast 排队情况 - CPU 在 idle 状态占比低?用
adb shell top -m 10 -n 1看 top 进程的 %CPU 和 Sched Policy(CFS vs RT) - 怀疑 GPU 过载?
adb shell dumpsys gfxinfo <package></package>中的 “Draw commands” 和 “Janky frames” 比 FPS 更反映渲染压力
自动化与回溯:让分析融入开发流程
靠人工点点点没法守住性能底线。CI 流水线里嵌入标准化检测脚本才是正解:冷启动超 1.5s 自动失败、帧率低于 55fps 提交阻断、内存泄漏检测结果不为 0 直接告警。Perfetto trace 可导出为 JSON,用 Python 脚本解析关键路径耗时;LeakCanary 的泄漏报告也能通过 webhook 推送到钉钉群,附带 commit hash 和 build 版本号。
- 启动性能回归测试:每次 PR 触发 3 次冷启 + 3 次热启,取中位数对比 baseline
- 内存稳定性测试:空闲 5 分钟后强制 GC,对比前后 retained heap delta
- 功耗基线测试:静置 30 分钟,采集 battery stats,计算每小时电量消耗 mAh











