如何在 Android Profiler 输出中查找主线程等待后台线程持有的锁的所有事件

How to find all occurrences where main thread waited on lock held by background thread in a Android Profiler output

我的应用程序使用后台线程来初始化主线程加载英雄所需的一些东西 activity。它有一堆同步锁。我正在寻找一种快速方法来绘制可能的堆栈跟踪,其中主线程在应用程序启动期间等待后台线程持有的锁。我检查了 Thread Status Monitor. How do I debug this? What's causing it? 但这是在谈论时间点线程状态,因为我正在寻找在启动期间发生的所有此类事件而不知道这些事件发生在哪里。

我确实看到可以通过手动检查启动 android 配置文件跟踪并查看各种线程堆栈来查找这些事件来找到此信息,但是要查看大量数据。如果该工具可以显示主线程等待其他线程持有的锁的次数、花费的总时间以及它持有这些锁的位置,那就太好了。

Q1) 我们知道 Android profiler 是否可以显示这个吗?我查了 https://developer.android.com/studio/profile/cpu-profiler 但没找到。

Q2) 如果没有,是否有任何其他工具可以解析分析器导出的跟踪并打印此信息?

Q3) 如果没有,您是否有任何关于如何读取导出的跟踪文件的指示。它似乎是二进制的。我正在通过 https://github.com/JetBrains/android 来弄清楚。它现在似乎正在使用 perfetto,但我还没有能够编写任何实用程序来读取该数据。

更新:我发现 CPU profiling/Systrace 选项显示我的主线程确实保持空闲或等待一些资源,但是它没有关于它等待什么或什么的信息methods 运行 闲置一段时间后。关于如何结合 java 方法跟踪和系统跟踪视图的任何指示?

Perfetto 能够显示此信息。在给定线程的时间线上查找“锁定争用”消息。它还会打印哪个线程获得该锁的数据。