Android 性能优化工具先选择

我们直接来拆解 **Perfetto(System Trace)** 与 **Method Profiler(方法采样)** 的本质区别。

结论:Yes and No

  • **No(不能自动看到所有方法)**:如果是一段纯业务层/第三方库的计算代码(比如写了个 `for` 循环、解析了一个巨型 JSON,或者 TheRouter 在遍历 Dex),如果没有手动加 `Trace.beginSection()`,Perfetto 里面**绝对看不到这个方法的名字**,只会表现为当前线程的一个"长长的空白色块"(CPU 处于 Running 状态,但不知道具体在跑什么)。

  • **Yes(能看到 RecyclerView 等)**:你说的 `RecyclerView` 重复绘制、UI 卡顿、布局加载,在 Perfetto 里确实**一清二楚,不需要你手动加代码**。

为什么会存在这种"双标"?

1. Perfetto 的本质是 ATrace(打桩日志),而不是"透视镜"

Perfetto(系统级追踪)的核心原理是去抓取系统内核调度信息(Ftrace)和应用层的 **ATrace 标记**。

你之所以能在 Perfetto 里看到 `RecyclerView` 的绘制、`Choreographer#doFrame`、`inflate`、`traversal`(测量/布局/绘制),是因为 **Google 的工程师在 Android 源码里,早就在这些关键节点帮你写好了 `Trace.beginSection()`**。

所以:**只要是 Android Framework 框架层的核心动作,天生自带 Trace 标记。**

2. TheRouter 和 InitRouterTask 为什么是"隐形"的?

TheRouter 或者你们自己的 `WalletRouter` 是第三方 SDK 或业务代码。当这些代码在主线程狂跑时,因为里面没有插 `Trace.beginSection()`,系统就只知道:"哦,主线程现在很忙,CPU 占用率很高",但至于它在忙什么,Perfetto 作为一个系统级的监控工具,是"盲"的。

就像一个交通摄像头:它能清楚地看到你的车在马路上堵了 1 分钟(线程阻塞),也能看到你正在通过收费站(Framework 的自带标记),但**它无法知道司机在车里具体是在喝水还是在看手机**(业务方法的具体逻辑)。


如果我不加代码,就想看清楚里面到底在跑哪个方法,怎么办?

如果你遇到了一段不明原因的"黑色耗时空洞",不想加代码,你可以随时切换武器:**放弃 Perfetto 的常规抓取,改用 Method Tracing(方法栈采样)**。

在 Android Studio Profiler(或者通过 Perfetto 的 Callstack Profiling 功能)里,有两种模式可以让你"透视"车里的司机在干嘛:

  1. **Sample Java Methods(采样模式)**:系统每隔 1 毫秒(比如),强行暂停一次你的线程,拍个照,看看当前的调用栈(Call Stack)停在哪个方法上。如果 `TheRouter` 遍历 Dex 花了 200ms,那这 200 毫秒内的 200 张照片里,肯定全都是 `cn.therouter...ClassUtils` 的调用!这样就能精准定位。

  2. **Trace Java Methods(全量方法插桩模式)**:这个模式下,虚拟机给应用里的**每一个** Java 方法都自动挂上了监控,极度精准,但开销巨大,会让 App 卡得像 PPT,一般只用来分析极短时间的微观性能。

总结

  • **宏观全局诊断 / UI 掉帧排查** -> 用 **Perfetto (System Trace)**。它开销极小,能看清多线程调度、Framework 瓶颈(如 RecyclerView 耗时)、系统 I/O。

  • **微观黑盒深挖 / 揪出耗时的业务方法** -> 配合使用 **CPU Profiler 的 Callstack Sampling(调用栈采样)**。