常见任务

大多数对 Perfetto 的贡献都属于以下类别之一。

UI

由于 UI 的插件化,对 UI 的大部分贡献应该与创建/修改插件有关。 转到 UI 插件页面 了解如何操作。

Trace Processor

贡献给 SQL 标准库

  1. perfetto/src/trace_processor/stdlib/ 内添加或编辑 SQL 文件。该 SQL 文件将是一个新的标准库模块。
  2. 对于现有包内的新文件,将该文件添加到相应的 BUILD.gn 中。
  3. 对于新包(/stdlib/ 的子目录),包名(目录名)必须添加到 /stdlib/BUILD.gn 中的列表中。

标准库内的文件必须以非常特定的方式格式化,因为其结构用于生成文档。有预提交检查,但它们并非万无一失。

文档

NOTE: 导入描述外的换行将被忽略。

模块 android 中格式正确的视图示例:

-- 计算每个进程的 Binder 事务。 CREATE PERFETTO VIEW android_binder_metrics_by_process( -- 启动 binder 事务的进程名称。 process_name STRING, -- 启动 binder 事务的进程的 PID。 pid INT, -- 带有 binder 事务的 slice 名称。 slice_name STRING, -- slice 中进程内的 binder 事务数。 event_count INT ) AS SELECT process.name AS process_name, process.pid AS pid, slice.name AS slice_name, COUNT(*) AS event_count FROM slice JOIN thread_track ON slice.track_id = thread_track.id JOIN thread ON thread.utid = thread_track.utid JOIN process ON thread.upid = process.upid WHERE slice.name GLOB 'binder*' GROUP BY process_name, slice_name;

模块 android 中的表函数示例:

-- 给定启动 ID 和 slice 名称的 GLOB,返回匹配 slice 的列。 CREATE PERFETTO FUNCTION ANDROID_SLICES_FOR_LAUNCH_AND_SLICE_NAME( -- 启动的 ID。 launch_id INT, -- 带有启动的 slice 名称。 slice_name STRING ) RETURNS TABLE( -- 带有启动的 slice 名称。 slice_name STRING, -- slice 开始的时间戳。 slice_ts TIMESTAMP, -- slice 的持续时间。 slice_dur DURATION, -- 带有 slice 的线程名称。 thread_name STRING, -- 参数集 ID。 arg_set_id ARGSETID ) AS SELECT slice_name, slice_ts, slice_dur, thread_name, arg_set_id FROM thread_slices_for_all_launches WHERE launch_id = $launch_id AND slice_name GLOB $slice_name;

添加新的 trace processor 表

  1. 通过复制其中一个现有的宏定义,在 src/trace_processor/tables 中的相应头文件中创建新表。
  1. TraceProcessorImpl 类 的构造函数中向 trace processor 注册表。
  2. 如果还实现事件到表中的摄取:
    1. 修改 src/trace_processor/importers 中的相应解析器类,并添加代码以将行添加到新添加的表中。
    2. 为添加的解析代码和表添加新的差异测试。
    3. 使用 tools/diff_test_trace_processor.py <path to trace processor shell binary> 运行新添加的测试。
  3. 像往常一样上传和合并你的更改。

更新 TRACE_PROCESSOR_CURRENT_API_VERSION

通常,你不必担心 UI 和 trace_processor 之间的版本偏差,因为它们在同一提交处一起构建。但是,当使用允许原生 trace_processor 实例与 UI 一起使用的 --httpd 模式时,可能会发生版本偏差。

常见情况是 UI 比 trace_processor 更新,并且依赖于新的表定义。在 --httpd 模式下使用旧版本的 trace_processor 时,UI 尝试查询不存在的表时会崩溃。为了避免这种情况,我们使用版本号。如果 trace_processor 报告的版本号低于 UI 构建时的版本号,我们会提示用户更新。

  1. 转到 protos/perfetto/trace_processor/trace_processor.proto
  2. 增加 TRACE_PROCESSOR_CURRENT_API_VERSION
  3. 添加注释解释发生了什么变化。

添加新的基于 trace 的 metric

  1. protos/perfetto/metrics 文件夹中创建包含 metric 的 proto 文件。还应该更新相应的 BUILD.gn 文件。
  2. protos/perfetto/metrics/metrics.proto 中导入 proto 并为新消息添加字段。
  3. 运行 tools/gen_all out/YOUR_BUILD_DIRECTORY。这将更新包含 proto 描述符的生成的头文件。
  1. 为 metric 在 src/trace_processor/metrics 中添加新的 SQL 文件。还应该更新相应的 BUILD.gn 文件。
  1. 使用 tools/ninja -C out/YOUR_BUILD_DIRECTORY 构建输出目录中的所有目标。
  2. 为 metric 添加新的差异测试。可以通过将文件添加到适当的 test/trace_processor 子文件夹中的 tests_*.py 文件来完成。
  3. 使用 tools/diff_test_trace_processor.py <path to trace processor binary> 运行新添加的测试。
  4. 像往常一样上传和合并你的更改。

Ftrace

添加新的 ftrace 事件

  1. 找到事件的 format 文件。文件的位置取决于 tracefs 的挂载位置,但通常可以在 /sys/kernel/debug/tracing/events/EVENT_GROUP/EVENT_NAME/format 找到。
  2. 将格式文件复制到代码库中的 src/traced/probes/ftrace/test/data/synthetic/events/EVENT_GROUP/EVENT_NAME/format
  3. 将事件添加到 src/tools/ftrace_proto_gen/event_list
  4. 运行 tools/run_ftrace_proto_gen。这将更新 protos/perfetto/trace/ftrace/ftrace_event.protoprotos/perfetto/trace/ftrace/GROUP_NAME.proto
  5. 运行 tools/gen_all out/YOUR_BUILD_DIRECTORY。这将更新 src/traced/probes/ftrace/event_info.ccprotos/perfetto/trace/perfetto_trace.proto
  6. 如果需要在 trace_processor 中进行特殊处理,请更新 src/trace_processor/importers/ftrace/ftrace_parser.cc 以解析事件。
  7. 像往常一样上传和合并你的更改。

这是一个 示例更改,它添加了一个新事件。NOTE: Perfetto 的权威来源自该更改以来已移至 GitHub,因此虽然该更改的内容是准确的,但你应该通过 GitHub 而不是在 AOSP Gerrit 上发送补丁。

要测试你的更改,你可以在 Android 设备上 sideload 本地构建的 tracebox 二进制文件。有关更多详细信息,请参阅 Android Sideloading

Android Sideloading

要在 Android 设备上测试更改(例如,添加新的 ftrace 事件时), 你可以使用 record_android_trace 脚本来 sideload 本地构建的 tracebox 二进制文件。

  1. 为 Android 构建 tracebox。 有关如何为 Android 配置构建的说明,请参阅 入门

    # 这假设你已按照上述链接的说明配置了 out/android。 tools/ninja -C out/android_release_arm64 tracebox
  2. 使用 record_android_trace sideload 并采集 trace:

    tools/record_android_trace \ --sideload-path out/android_release_arm64/tracebox \ -o trace.pftrace \ -t 10s \ -b 32mb \ sched/sched_switch

--sideload-path 参数告诉脚本将本地构建的 tracebox 二进制文件推送到设备并用于记录。

Statsd

更新 statsd 描述符

Perfetto 对它不知道的 statsd 原子有有限的支持。

要更新 Perfetto 的描述符并处理来自 AOSP 的新原子而没有这些 限制:

  1. 运行 tools/update-statsd-descriptor
  2. 像往常一样上传和合并你的更改。