如何找出我的代码的哪些部分最常使用 UI 线程?

How can I find out which parts of my code are using the UI Thread the most?

我正在尝试在没有任何堆栈跟踪的情况下追踪一些 ANR。我现在只想检查我的代码中大量使用 UI 线程的每一部分。

有没有一种方法可以对此进行绘图或进行某种跟踪以查看哪些方法花费的时间最长而无需我修改大量代码?

您可以做的第一件事是启用 StrictMode。这将检测 non-UI,可能会在主线程上执行 运行 长时间操作。

您可以做的第二件事是分析 CPU,如上所述。您将能够看到每个线程的 activity,因此您可以确定 运行ning 在哪里。为了获得准确的读数,请勿 运行 来自 Android Studio。 运行 它直接来自您的代码。最简单的方法是使用 Debug class,并在 Application.onCreate 处开始采样并在应用程序关闭时完成采样。

你可以做的第三件事是观察发送到主线程循环器的消息并评估它们。 Pierre-Yves Ricau 对此有一个 nice guide ,您可以根据自己的流程进行调整。

之后,您可以使用自定义方法来评估代码的关键部分,例如生成您自己的跟踪。 Perfetto 使用 JSON 文件,因此您可以从您怀疑造成问题的部分打印 logcat 消息并将这些消息解析为 perfetto trace.

首先,你没有提到代码是 java 还是 jni。

无论如何,我的以下评论是部分回复,因为它不是关于寻找最长的 运行 函数,而是关于一般调试 ANR。

在调试 ANR 时,我会像处理死锁一样处理它。当看到应用卡住时,尝试 dump 当前堆栈跟踪。它可能比常规的 ANR 跟踪效果更好。

您可以做的另一件事是附加调试器并在发现应用卡住时暂停应用。

要尝试的最后一件事是在进入和退出函数调用时围绕您的代码添加日志,并查看最后一个进入但没有退出的代码。您也可以尝试关注 this.