跟进我之前的问题:如何在 Android Profiler 输出中查找主线程等待后台线程持有的锁的所有事件,我发现 Perfetto 提供了这些数据。它还具有类似 SQL 的接口,用于进一步查询。尽管我能够在 Perfetto UI 上找到一个或两个实例,但我想编写一个查询来查找所有可能出现的主线程空闲或等待锁定的情况。
为此,我正在探索似乎有一些预建查询的Perfetto 指标部分。
> SELECT RUN_METRIC('android/android_startup.sql')
# Given this information is associated with slice, I decided to print activityResume stats alone and then modify for my use case
> SELECT slice_proto FROM main_process_slice s, launches WHERE s.launch_id = launches.id AND name = 'activityResume'
slice_proto
--------------------
<raw bytes>
但是它会打印原始字节,因为这是 protobuf 对象。我尝试按照Perfetto 指标按照教程来打印 protobuf,但无法找出解决方案。
这是我尝试过的
> SELECT AndroidStartupMetric_Slice(slice_proto) FROM main_process_slice s, launches WHERE s.launch_id = launches.id AND name = 'activityResume'
[806.323] _processor_shell.cc:486 SQLite error: Invalid number of args to .perfetto.protos.AndroidStartupMetric.Slice BuildProto (got 1)
> SELECT AndroidStartupMetric_Slice('dur_ns', slice.dur, 'dur_ms', slice.dur / 1e6) FROM main_process_slice s WHERE s.launch_id = launches.id AND name = 'activityResume'
[938.439] _processor_shell.cc:486 SQLite error: no such column: slice.dur
有人知道我错过了什么吗?我也尝试了 python API 并遇到了同样的问题。我没有编译可用于反序列化的 protobuf 结构(尽管编译一个可能不是那么大的任务)。Q1) 我如何打印 protobuf 对象 Q2) 绘制主线程空闲或争用直到第一帧的所有事件的快速方法是什么?