剖析而不是猜测

启动慢、滑动卡,最怕的是凭感觉优化一通、结果纹丝不动。Android Studio 的 Profiler 把每一段耗时画成时间线,瓶颈一目了然。性能剖析的纪律是:先量、再改、再量。

没有火焰图的优化都是玄学:先看哪个函数真的吃时间,再决定动哪。

这篇从启动链路讲到卡顿、内存,把 Android 性能剖析走一遍。

启动链路时间线

冷启动依次经过:进程创建、Application onCreate、Activity onCreate、首帧绘制。每一段都可能被同步初始化拖长。看时间线先找最长的那段,通常就在 Application 的初始化里。

// 在启动关键路径埋点
val t0 = System.nanoTime()
initSdk()
Log.d("boot", "initSdk cost ${(System.nanoTime()-t0)/1e6}ms")

用埋点把每段耗时量化,配合 Profiler 时间线定位。

用 System Trace 看启动

System Trace 录制一次冷启动,能看到主线程每一刻在干什么、卡在哪一帧。主线程被某段同步代码占住的那段红色长条,就是要优化的目标。

剖析工具速查
  • System Trace启动与帧时间线。
  • CPU Profiler方法级火焰图。
  • Memory Profiler堆与泄漏。
  • Energy Profiler能耗与唤醒。

火焰图找 CPU 瓶颈

CPU Profiler 录一段,看火焰图:越宽的柱子占的 CPU 越多。找到业务函数里最宽的那根,就是要优化的热点。常见是主线程做了 IO、序列化或大对象构建。

安卓性能剖析:中央抽象设备周围环绕波形曲线图与性能仪表盘发光图标的扁平科技插画
剖析:波形与仪表盘把耗时画出来。

卡顿与掉帧定位

滑动卡是因为某帧超过 16ms 没画完。Systrace 里那一帧对应的红色长条,就是阻塞主线程的代码。把它移出主线程,或拆成异步,帧率就回来了。