tp: Add TrackEvent plugin registry + android_track_event_process table TrackEventParser gains a field-id-keyed plugin registry. The frameworks/base plugin feeds the process table from process lifecycle events -- start sets name/uid via GetOrCreateProcess, binder-died EndThread()s the pid -- and keeps the framework start/end timestamps in the new __intrinsic_android_track_event_process table (upid, fw_start_ts, fw_end_ts). Drops the aliased IMPORTANCE_BACKGROUND enumerator, which pbzero's switch-based ToString rejects under -Werror. This field is deprecated in favor of importance_cached anyways. Change-Id: I958d9c9707d0f5629a17eb3468beb82a20fbf923
diff --git a/Android.bp b/Android.bp index 13f8399..8a920fc 100644 --- a/Android.bp +++ b/Android.bp
@@ -3001,6 +3001,7 @@ ":perfetto_protos_perfetto_trace_translation_zero_gen", ":perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_interned_data_zero_gen", ":perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_trace_packet_zero_gen", + ":perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero_gen", ":perfetto_protos_third_party_chromium_zero_gen", ":perfetto_protos_third_party_pprof_zero_gen", ":perfetto_protos_third_party_primes_cpp_gen", @@ -3119,6 +3120,7 @@ ":perfetto_src_trace_processor_perfetto_sql_syntaqlite_syntaqlite", ":perfetto_src_trace_processor_perfetto_sql_tokenizer_tokenizer", ":perfetto_src_trace_processor_plugins_ancestor_ancestor", + ":perfetto_src_trace_processor_plugins_android_framework_track_event_android_framework_track_event", ":perfetto_src_trace_processor_plugins_args_args", ":perfetto_src_trace_processor_plugins_art_heap_graph_functions_art_heap_graph_functions", ":perfetto_src_trace_processor_plugins_base64_functions_base64_functions", @@ -3425,6 +3427,7 @@ "perfetto_protos_perfetto_trace_translation_zero_gen_headers", "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_interned_data_zero_gen_headers", "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_trace_packet_zero_gen_headers", + "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero_gen_headers", "perfetto_protos_third_party_chromium_zero_gen_headers", "perfetto_protos_third_party_pprof_zero_gen_headers", "perfetto_protos_third_party_primes_cpp_gen_headers", @@ -14762,6 +14765,52 @@ ], } +// GN: //protos/third_party/android/frameworks/base/proto/tracing:frameworks_base_track_event_zero +filegroup { + name: "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero", + srcs: [ + "protos/third_party/android/frameworks/base/proto/tracing/frameworks_base_track_event.proto", + ], +} + +// GN: //protos/third_party/android/frameworks/base/proto/tracing:frameworks_base_track_event_zero +genrule { + name: "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero_gen", + srcs: [ + ":perfetto_protos_perfetto_trace_track_event_zero", + ":perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero", + ], + tools: [ + "aprotoc", + "protozero_plugin", + ], + cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --plugin=protoc-gen-plugin=$(location protozero_plugin) --plugin_out=wrapper_namespace=pbzero:$(genDir)/external/perfetto/ $(locations :perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero)", + out: [ + "external/perfetto/protos/third_party/android/frameworks/base/proto/tracing/frameworks_base_track_event.pbzero.cc", + ], +} + +// GN: //protos/third_party/android/frameworks/base/proto/tracing:frameworks_base_track_event_zero +genrule { + name: "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero_gen_headers", + srcs: [ + ":perfetto_protos_perfetto_trace_track_event_zero", + ":perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero", + ], + tools: [ + "aprotoc", + "protozero_plugin", + ], + cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --plugin=protoc-gen-plugin=$(location protozero_plugin) --plugin_out=wrapper_namespace=pbzero:$(genDir)/external/perfetto/ $(locations :perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero)", + out: [ + "external/perfetto/protos/third_party/android/frameworks/base/proto/tracing/frameworks_base_track_event.pbzero.h", + ], + export_include_dirs: [ + ".", + "protos", + ], +} + // GN: //protos/third_party/chromium:descriptor genrule { name: "perfetto_protos_third_party_chromium_descriptor", @@ -17711,6 +17760,7 @@ name: "perfetto_src_trace_processor_importers_proto_proto_importer_module", srcs: [ "src/trace_processor/importers/proto/proto_importer_module.cc", + "src/trace_processor/importers/proto/track_event_plugin.cc", ], } @@ -18699,6 +18749,14 @@ ], } +// GN: //src/trace_processor/plugins/android_framework_track_event:android_framework_track_event +filegroup { + name: "perfetto_src_trace_processor_plugins_android_framework_track_event_android_framework_track_event", + srcs: [ + "src/trace_processor/plugins/android_framework_track_event/android_framework_track_event.cc", + ], +} + // GN: //src/trace_processor/plugins/args:args filegroup { name: "perfetto_src_trace_processor_plugins_args_args", @@ -20154,6 +20212,7 @@ ":perfetto_protos_perfetto_trace_translation_zero_gen", ":perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_interned_data_zero_gen", ":perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_trace_packet_zero_gen", + ":perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero_gen", ":perfetto_protos_third_party_chromium_zero_gen", ":perfetto_protos_third_party_pprof_zero_gen", ":perfetto_protos_third_party_primes_cpp_gen", @@ -20234,6 +20293,7 @@ ":perfetto_src_trace_processor_perfetto_sql_syntaqlite_syntaqlite", ":perfetto_src_trace_processor_perfetto_sql_tokenizer_tokenizer", ":perfetto_src_trace_processor_plugins_ancestor_ancestor", + ":perfetto_src_trace_processor_plugins_android_framework_track_event_android_framework_track_event", ":perfetto_src_trace_processor_plugins_args_args", ":perfetto_src_trace_processor_plugins_art_heap_graph_functions_art_heap_graph_functions", ":perfetto_src_trace_processor_plugins_base64_functions_base64_functions", @@ -20400,6 +20460,7 @@ "perfetto_protos_perfetto_trace_translation_zero_gen_headers", "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_interned_data_zero_gen_headers", "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_trace_packet_zero_gen_headers", + "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero_gen_headers", "perfetto_protos_third_party_chromium_zero_gen_headers", "perfetto_protos_third_party_pprof_zero_gen_headers", "perfetto_protos_third_party_primes_cpp_gen_headers", @@ -20500,6 +20561,7 @@ "perfetto_protos_perfetto_trace_translation_zero_gen_headers", "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_interned_data_zero_gen_headers", "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_trace_packet_zero_gen_headers", + "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero_gen_headers", "perfetto_protos_third_party_chromium_zero_gen_headers", "perfetto_protos_third_party_pprof_zero_gen_headers", "perfetto_protos_third_party_primes_cpp_gen_headers", @@ -22671,6 +22733,7 @@ ":perfetto_protos_perfetto_trace_translation_zero_gen", ":perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_interned_data_zero_gen", ":perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_trace_packet_zero_gen", + ":perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero_gen", ":perfetto_protos_third_party_chromium_zero_gen", ":perfetto_protos_third_party_pprof_zero_gen", ":perfetto_protos_third_party_primes_cpp_gen", @@ -22862,6 +22925,7 @@ ":perfetto_src_trace_processor_perfetto_sql_tokenizer_unittests", ":perfetto_src_trace_processor_plugins_ancestor_ancestor", ":perfetto_src_trace_processor_plugins_ancestor_unittests", + ":perfetto_src_trace_processor_plugins_android_framework_track_event_android_framework_track_event", ":perfetto_src_trace_processor_plugins_args_args", ":perfetto_src_trace_processor_plugins_art_heap_graph_functions_art_heap_graph_functions", ":perfetto_src_trace_processor_plugins_base64_functions_base64_functions", @@ -23217,6 +23281,7 @@ "perfetto_protos_perfetto_trace_translation_zero_gen_headers", "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_interned_data_zero_gen_headers", "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_trace_packet_zero_gen_headers", + "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero_gen_headers", "perfetto_protos_third_party_chromium_zero_gen_headers", "perfetto_protos_third_party_pprof_zero_gen_headers", "perfetto_protos_third_party_primes_cpp_gen_headers", @@ -23856,6 +23921,7 @@ ":perfetto_protos_perfetto_trace_translation_zero_gen", ":perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_interned_data_zero_gen", ":perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_trace_packet_zero_gen", + ":perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero_gen", ":perfetto_protos_third_party_chromium_zero_gen", ":perfetto_protos_third_party_pprof_zero_gen", ":perfetto_protos_third_party_primes_cpp_gen", @@ -23932,6 +23998,7 @@ ":perfetto_src_trace_processor_perfetto_sql_syntaqlite_syntaqlite", ":perfetto_src_trace_processor_perfetto_sql_tokenizer_tokenizer", ":perfetto_src_trace_processor_plugins_ancestor_ancestor", + ":perfetto_src_trace_processor_plugins_android_framework_track_event_android_framework_track_event", ":perfetto_src_trace_processor_plugins_args_args", ":perfetto_src_trace_processor_plugins_art_heap_graph_functions_art_heap_graph_functions", ":perfetto_src_trace_processor_plugins_base64_functions_base64_functions", @@ -24087,6 +24154,7 @@ "perfetto_protos_perfetto_trace_translation_zero_gen_headers", "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_interned_data_zero_gen_headers", "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_trace_packet_zero_gen_headers", + "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero_gen_headers", "perfetto_protos_third_party_chromium_zero_gen_headers", "perfetto_protos_third_party_pprof_zero_gen_headers", "perfetto_protos_third_party_primes_cpp_gen_headers", @@ -24183,6 +24251,7 @@ "perfetto_protos_perfetto_trace_translation_zero_gen_headers", "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_interned_data_zero_gen_headers", "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_trace_packet_zero_gen_headers", + "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero_gen_headers", "perfetto_protos_third_party_chromium_zero_gen_headers", "perfetto_protos_third_party_pprof_zero_gen_headers", "perfetto_protos_third_party_primes_cpp_gen_headers", @@ -24509,6 +24578,7 @@ ":perfetto_protos_perfetto_trace_translation_zero_gen", ":perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_interned_data_zero_gen", ":perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_trace_packet_zero_gen", + ":perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero_gen", ":perfetto_protos_third_party_chromium_zero_gen", ":perfetto_protos_third_party_pprof_zero_gen", ":perfetto_protos_third_party_primes_cpp_gen", @@ -24587,6 +24657,7 @@ ":perfetto_src_trace_processor_perfetto_sql_syntaqlite_syntaqlite", ":perfetto_src_trace_processor_perfetto_sql_tokenizer_tokenizer", ":perfetto_src_trace_processor_plugins_ancestor_ancestor", + ":perfetto_src_trace_processor_plugins_android_framework_track_event_android_framework_track_event", ":perfetto_src_trace_processor_plugins_args_args", ":perfetto_src_trace_processor_plugins_art_heap_graph_functions_art_heap_graph_functions", ":perfetto_src_trace_processor_plugins_base64_functions_base64_functions", @@ -24751,6 +24822,7 @@ "perfetto_protos_perfetto_trace_translation_zero_gen_headers", "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_interned_data_zero_gen_headers", "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_trace_packet_zero_gen_headers", + "perfetto_protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero_gen_headers", "perfetto_protos_third_party_chromium_zero_gen_headers", "perfetto_protos_third_party_pprof_zero_gen_headers", "perfetto_protos_third_party_primes_cpp_gen_headers",
diff --git a/BUILD b/BUILD index a6917af..dbb2008 100644 --- a/BUILD +++ b/BUILD
@@ -464,6 +464,7 @@ ":src_trace_processor_perfetto_sql_tokenizer_tokenizer", ":src_trace_processor_plugins_ancestor_ancestor", ":src_trace_processor_plugins_ancestor_tables", + ":src_trace_processor_plugins_android_framework_track_event_android_framework_track_event", ":src_trace_processor_plugins_args_args", ":src_trace_processor_plugins_art_heap_graph_functions_art_heap_graph_functions", ":src_trace_processor_plugins_base64_functions_base64_functions", @@ -645,6 +646,7 @@ ":protos_perfetto_trace_translation_zero", ":protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_interned_data_zero", ":protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_trace_packet_zero", + ":protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero", ":protos_third_party_chromium_zero", ":protos_third_party_pprof_zero", ":protos_third_party_primes_cpp", @@ -755,6 +757,7 @@ ":src_trace_processor_perfetto_sql_tokenizer_tokenizer", ":src_trace_processor_plugins_ancestor_ancestor", ":src_trace_processor_plugins_ancestor_tables", + ":src_trace_processor_plugins_android_framework_track_event_android_framework_track_event", ":src_trace_processor_plugins_args_args", ":src_trace_processor_plugins_art_heap_graph_functions_art_heap_graph_functions", ":src_trace_processor_plugins_base64_functions_base64_functions", @@ -950,6 +953,7 @@ ":protos_perfetto_trace_translation_zero", ":protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_interned_data_zero", ":protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_trace_packet_zero", + ":protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero", ":protos_third_party_chromium_zero", ":protos_third_party_pprof_zero", ":protos_third_party_primes_cpp", @@ -3258,6 +3262,8 @@ srcs = [ "src/trace_processor/importers/proto/proto_importer_module.cc", "src/trace_processor/importers/proto/proto_importer_module.h", + "src/trace_processor/importers/proto/track_event_plugin.cc", + "src/trace_processor/importers/proto/track_event_plugin.h", ], ) @@ -4327,6 +4333,15 @@ ], ) +# GN target: //src/trace_processor/plugins/android_framework_track_event:android_framework_track_event +perfetto_filegroup( + name = "src_trace_processor_plugins_android_framework_track_event_android_framework_track_event", + srcs = [ + "src/trace_processor/plugins/android_framework_track_event/android_framework_track_event.cc", + "src/trace_processor/plugins/android_framework_track_event/android_framework_track_event.h", + ], +) + # GN target: //src/trace_processor/plugins/args:args perfetto_filegroup( name = "src_trace_processor_plugins_args_args", @@ -10007,6 +10022,15 @@ ], ) +# GN target: //protos/third_party/android/frameworks/base/proto/tracing:frameworks_base_track_event_zero +perfetto_cc_protozero_library( + name = "protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero", + deps = [ + ":protos_perfetto_trace_track_event_zero", + ":protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_protos", + ], +) + # GN target: //protos/third_party/android/frameworks/native/tracing:frameworks_native_track_event_source_set perfetto_proto_library( name = "protos_third_party_android_frameworks_native_tracing_frameworks_native_track_event_protos", @@ -10473,6 +10497,7 @@ ":src_trace_processor_perfetto_sql_tokenizer_tokenizer", ":src_trace_processor_plugins_ancestor_ancestor", ":src_trace_processor_plugins_ancestor_tables", + ":src_trace_processor_plugins_android_framework_track_event_android_framework_track_event", ":src_trace_processor_plugins_args_args", ":src_trace_processor_plugins_art_heap_graph_functions_art_heap_graph_functions", ":src_trace_processor_plugins_base64_functions_base64_functions", @@ -10654,6 +10679,7 @@ ":protos_perfetto_trace_translation_zero", ":protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_interned_data_zero", ":protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_trace_packet_zero", + ":protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero", ":protos_third_party_chromium_zero", ":protos_third_party_pprof_zero", ":protos_third_party_primes_cpp", @@ -10794,6 +10820,7 @@ ":src_trace_processor_perfetto_sql_tokenizer_tokenizer", ":src_trace_processor_plugins_ancestor_ancestor", ":src_trace_processor_plugins_ancestor_tables", + ":src_trace_processor_plugins_android_framework_track_event_android_framework_track_event", ":src_trace_processor_plugins_args_args", ":src_trace_processor_plugins_art_heap_graph_functions_art_heap_graph_functions", ":src_trace_processor_plugins_base64_functions_base64_functions", @@ -10966,6 +10993,7 @@ ":protos_perfetto_trace_translation_zero", ":protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_interned_data_zero", ":protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_trace_packet_zero", + ":protos_third_party_android_frameworks_base_proto_tracing_frameworks_base_track_event_zero", ":protos_third_party_chromium_zero", ":protos_third_party_pprof_zero", ":protos_third_party_primes_cpp",
diff --git a/protos/third_party/android/frameworks/base/proto/tracing/frameworks_base_track_event.proto b/protos/third_party/android/frameworks/base/proto/tracing/frameworks_base_track_event.proto index 4f4b399..8c3d066 100644 --- a/protos/third_party/android/frameworks/base/proto/tracing/frameworks_base_track_event.proto +++ b/protos/third_party/android/frameworks/base/proto/tracing/frameworks_base_track_event.proto
@@ -277,8 +277,6 @@ } enum Importance { - option allow_alias = true; - IMPORTANCE_UNKNOWN = 0; IMPORTANCE_FOREGROUND = 100; IMPORTANCE_FOREGROUND_SERVICE = 125; @@ -291,7 +289,6 @@ IMPORTANCE_TOP_SLEEPING = 325; IMPORTANCE_CANT_SAVE_STATE = 350; IMPORTANCE_CACHED = 400; - IMPORTANCE_BACKGROUND = 400; IMPORTANCE_EMPTY = 500; IMPORTANCE_GONE = 1000; }
diff --git a/src/trace_processor/BUILD.gn b/src/trace_processor/BUILD.gn index f738973..69771f6 100644 --- a/src/trace_processor/BUILD.gn +++ b/src/trace_processor/BUILD.gn
@@ -203,6 +203,7 @@ "perfetto_sql/generator", "perfetto_sql/stdlib", "plugins/ancestor", + "plugins/android_framework_track_event", "plugins/args", "plugins/art_heap_graph_functions", "plugins/base64_functions",
diff --git a/src/trace_processor/importers/proto/BUILD.gn b/src/trace_processor/importers/proto/BUILD.gn index b0f9142..62d58a8 100644 --- a/src/trace_processor/importers/proto/BUILD.gn +++ b/src/trace_processor/importers/proto/BUILD.gn
@@ -255,6 +255,8 @@ sources = [ "proto_importer_module.cc", "proto_importer_module.h", + "track_event_plugin.cc", + "track_event_plugin.h", ] public_deps = [ ":packet_sequence_state_generation_hdr" ] deps = [ @@ -262,6 +264,7 @@ "../../../../gn:default_deps", "../../../../include/perfetto/trace_processor:trace_processor", "../../../base", + "../../../protozero", "../../sorter", "../../types", "../common:parser_types",
diff --git a/src/trace_processor/importers/proto/additional_modules.cc b/src/trace_processor/importers/proto/additional_modules.cc index 6a0c537..6b6a35b 100644 --- a/src/trace_processor/importers/proto/additional_modules.cc +++ b/src/trace_processor/importers/proto/additional_modules.cc
@@ -41,6 +41,7 @@ #include "src/trace_processor/importers/proto/statsd_module.h" #include "src/trace_processor/importers/proto/system_probes_module.h" #include "src/trace_processor/importers/proto/trace.descriptor.h" +#include "src/trace_processor/importers/proto/track_event_module.h" #include "src/trace_processor/importers/proto/translation_table_module.h" #include "src/trace_processor/importers/proto/v8_module.h" #include "src/trace_processor/types/trace_processor_context.h"
diff --git a/src/trace_processor/importers/proto/proto_importer_module.h b/src/trace_processor/importers/proto/proto_importer_module.h index 1a3b564..99c6642 100644 --- a/src/trace_processor/importers/proto/proto_importer_module.h +++ b/src/trace_processor/importers/proto/proto_importer_module.h
@@ -29,6 +29,7 @@ #include "perfetto/trace_processor/ref_counted.h" #include "src/trace_processor/importers/common/parser_types.h" #include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" +#include "src/trace_processor/importers/proto/track_event_plugin.h" #include "src/trace_processor/sorter/trace_sorter.h" namespace perfetto { @@ -180,6 +181,9 @@ EtwModule* etw_module = nullptr; TrackEventModule* track_module = nullptr; + // TrackEvent extensions, populated by plugins and read by TrackEventParser. + TrackEventPluginRegistry track_event_plugins; + std::unique_ptr<TraceSorter::Stream<TracePacketData>> trace_packet_stream; std::unique_ptr<TraceSorter::Stream<TrackEventData>> track_event_stream;
diff --git a/src/trace_processor/importers/proto/track_event_event_importer.h b/src/trace_processor/importers/proto/track_event_event_importer.h index c7cb96c..957b0a9 100644 --- a/src/trace_processor/importers/proto/track_event_event_importer.h +++ b/src/trace_processor/importers/proto/track_event_event_importer.h
@@ -1297,6 +1297,7 @@ parser_->AddActiveProcess(ts_, *it); } } + if (event_.has_correlation_id()) { base::StackString<512> id_str("tp:#%" PRIu64, event_.correlation_id()); inserter->AddArg(parser_->correlation_id_key_id_,
diff --git a/src/trace_processor/importers/proto/track_event_module.cc b/src/trace_processor/importers/proto/track_event_module.cc index abb9394..ba73745 100644 --- a/src/trace_processor/importers/proto/track_event_module.cc +++ b/src/trace_processor/importers/proto/track_event_module.cc
@@ -41,7 +41,9 @@ : ProtoImporterModule(module_context), track_event_tracker_(new TrackEventTracker(context)), tokenizer_(module_context, context, track_event_tracker_.get()), - parser_(context, track_event_tracker_.get()) { + parser_(context, + track_event_tracker_.get(), + &module_context->track_event_plugins) { RegisterForField(TracePacket::kTrackEventRangeOfInterestFieldNumber); RegisterForField(TracePacket::kTrackEventFieldNumber); RegisterForField(TracePacket::kTrackDescriptorFieldNumber);
diff --git a/src/trace_processor/importers/proto/track_event_parser.cc b/src/trace_processor/importers/proto/track_event_parser.cc index a146127..449a522 100644 --- a/src/trace_processor/importers/proto/track_event_parser.cc +++ b/src/trace_processor/importers/proto/track_event_parser.cc
@@ -133,10 +133,12 @@ } // namespace TrackEventParser::TrackEventParser(TraceProcessorContext* context, - TrackEventTracker* track_event_tracker) + TrackEventTracker* track_event_tracker, + const TrackEventPluginRegistry* plugins) : args_parser_(*context->descriptor_pool_), context_(context), track_event_tracker_(track_event_tracker), + plugins_(plugins), counter_name_thread_time_id_( context->storage->InternString("thread_time")), counter_name_thread_instruction_count_id_( @@ -455,6 +457,8 @@ stats::track_event_dropped_packets_outside_of_range_of_interest); return; } + plugins_->ParseFields(blob, ts); + base::Status status = TrackEventEventImporter(this, ts, event_data, blob, packet_sequence_id) .Import();
diff --git a/src/trace_processor/importers/proto/track_event_parser.h b/src/trace_processor/importers/proto/track_event_parser.h index d7acfa8..a66a4f8 100644 --- a/src/trace_processor/importers/proto/track_event_parser.h +++ b/src/trace_processor/importers/proto/track_event_parser.h
@@ -25,6 +25,7 @@ #include "src/trace_processor/importers/common/slice_tracker.h" #include "src/trace_processor/importers/proto/active_chrome_processes_tracker.h" #include "src/trace_processor/importers/proto/chrome_string_lookup.h" +#include "src/trace_processor/importers/proto/track_event_plugin.h" #include "src/trace_processor/storage/trace_storage.h" #include "src/trace_processor/util/proto_to_args_parser.h" @@ -49,7 +50,9 @@ class TrackEventParser { public: - TrackEventParser(TraceProcessorContext*, TrackEventTracker*); + TrackEventParser(TraceProcessorContext*, + TrackEventTracker*, + const TrackEventPluginRegistry*); void ParseTrackDescriptor(int64_t packet_timestamp, protozero::ConstBytes, @@ -79,6 +82,7 @@ TraceProcessorContext* context_; TrackEventTracker* track_event_tracker_; + const TrackEventPluginRegistry* plugins_; const StringId counter_name_thread_time_id_; const StringId counter_name_thread_instruction_count_id_;
diff --git a/src/trace_processor/importers/proto/track_event_plugin.cc b/src/trace_processor/importers/proto/track_event_plugin.cc new file mode 100644 index 0000000..b1da7cf --- /dev/null +++ b/src/trace_processor/importers/proto/track_event_plugin.cc
@@ -0,0 +1,23 @@ +/* + * Copyright (C) 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "src/trace_processor/importers/proto/track_event_plugin.h" + +namespace perfetto::trace_processor { + +TrackEventPlugin::~TrackEventPlugin() = default; + +} // namespace perfetto::trace_processor
diff --git a/src/trace_processor/importers/proto/track_event_plugin.h b/src/trace_processor/importers/proto/track_event_plugin.h new file mode 100644 index 0000000..2680cb6 --- /dev/null +++ b/src/trace_processor/importers/proto/track_event_plugin.h
@@ -0,0 +1,71 @@ +/* + * Copyright (C) 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_TRACK_EVENT_PLUGIN_H_ +#define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_TRACK_EVENT_PLUGIN_H_ + +#include <cstdint> +#include <initializer_list> +#include <memory> +#include <vector> + +#include "perfetto/ext/base/flat_hash_map.h" +#include "perfetto/protozero/field.h" +#include "perfetto/protozero/proto_decoder.h" + +namespace perfetto::trace_processor { + +// Parses an extension field nested inside a TrackEvent. Registered against one +// or more TrackEvent field ids; ParseField runs for each matching field. +class TrackEventPlugin { + public: + virtual ~TrackEventPlugin(); + virtual void ParseField(uint32_t field_id, + protozero::ConstBytes data, + int64_t ts) = 0; +}; + +// Field-id-keyed dispatch to TrackEventPlugins. A no-op until something +// registers, so an empty registry costs one check per event. +class TrackEventPluginRegistry { + public: + // Registers `plugin` to handle each id in `field_ids`. Takes ownership. + void Register(std::unique_ptr<TrackEventPlugin> plugin, + std::initializer_list<uint32_t> field_ids) { + TrackEventPlugin* p = plugin.get(); + plugins_.push_back(std::move(plugin)); + for (uint32_t id : field_ids) + handlers_.Insert(id, p); + } + + void ParseFields(protozero::ConstBytes event_bytes, int64_t ts) const { + if (handlers_.size() == 0) + return; + protozero::ProtoDecoder decoder(event_bytes); + for (auto f = decoder.ReadField(); f.valid(); f = decoder.ReadField()) { + if (auto* h = handlers_.Find(f.id())) + (*h)->ParseField(f.id(), f.as_bytes(), ts); + } + } + + private: + base::FlatHashMap<uint32_t, TrackEventPlugin*> handlers_; + std::vector<std::unique_ptr<TrackEventPlugin>> plugins_; +}; + +} // namespace perfetto::trace_processor + +#endif // SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_TRACK_EVENT_PLUGIN_H_
diff --git a/src/trace_processor/plugins/android_framework_track_event/BUILD.gn b/src/trace_processor/plugins/android_framework_track_event/BUILD.gn new file mode 100644 index 0000000..a6f1511 --- /dev/null +++ b/src/trace_processor/plugins/android_framework_track_event/BUILD.gn
@@ -0,0 +1,35 @@ +# Copyright (C) 2026 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("../../../../gn/perfetto.gni") + +source_set("android_framework_track_event") { + sources = [ + "android_framework_track_event.cc", + "android_framework_track_event.h", + ] + deps = [ + "../../../../gn:default_deps", + "../../../../protos/third_party/android/frameworks/base/proto/tracing:frameworks_base_track_event_zero", + "../../../base", + "../../../protozero", + "../../core/plugin", + "../../importers/common", + "../../importers/common:parser_types", + "../../importers/proto:proto_importer_module", + "../../storage", + "../../tables", + "../../types", + ] +}
diff --git a/src/trace_processor/plugins/android_framework_track_event/android_framework_track_event.cc b/src/trace_processor/plugins/android_framework_track_event/android_framework_track_event.cc new file mode 100644 index 0000000..298e50e --- /dev/null +++ b/src/trace_processor/plugins/android_framework_track_event/android_framework_track_event.cc
@@ -0,0 +1,161 @@ +/* + * Copyright (C) 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "src/trace_processor/plugins/android_framework_track_event/android_framework_track_event.h" + +#include <cstdint> +#include <memory> +#include <optional> + +#include "perfetto/base/compiler.h" +#include "perfetto/ext/base/flat_hash_map.h" +#include "perfetto/protozero/field.h" +#include "protos/third_party/android/frameworks/base/proto/tracing/frameworks_base_track_event.pbzero.h" +#include "src/trace_processor/core/plugin/plugin.h" +#include "src/trace_processor/importers/common/process_tracker.h" +#include "src/trace_processor/importers/proto/proto_importer_module.h" +#include "src/trace_processor/importers/proto/track_event_plugin.h" +#include "src/trace_processor/storage/trace_storage.h" +#include "src/trace_processor/tables/android_tables_py.h" +#include "src/trace_processor/types/trace_processor_context.h" + +namespace perfetto::trace_processor::android_framework_track_event { +namespace { + +using FBTE = ::com::android::internal::pbzero::FrameworksBaseTrackEvent; +using AndroidProcessStartEvent = + ::com::android::internal::pbzero::AndroidProcessStartEvent; +using AndroidBinderDiedEvent = + ::com::android::internal::pbzero::AndroidBinderDiedEvent; + +// Records AndroidProcessStartEvent and AndroidBinderDiedEvent into +// __intrinsic_android_track_event_process (upid, fw_start_ts, fw_end_ts). +class Parser : public TrackEventPlugin { + public: + explicit Parser(TraceProcessorContext* context) : context_(context) {} + ~Parser() override = default; + + void ParseField(uint32_t field_id, + protozero::ConstBytes data, + int64_t ts) override { + switch (field_id) { + case FBTE::kProcessStartEventFieldNumber: + HandleProcessStart(data, ts); + break; + case FBTE::kBinderDiedEventFieldNumber: + HandleBinderDied(data, ts); + break; + } + } + + private: + void SetProcessMetadata(UniquePid upid, + const AndroidProcessStartEvent::Decoder& evt) { + if (evt.has_uid()) + context_->process_tracker->SetProcessUid( + upid, static_cast<uint32_t>(evt.uid())); + if (evt.has_process_name()) + context_->process_tracker->UpdateProcessName( + upid, context_->storage->InternString(evt.process_name()), + ProcessNamePriority::kOther); + } + + tables::AndroidTrackEventProcessTable::RowReference GetOrInsertRow( + UniquePid upid) { + auto* table = + context_->storage->mutable_android_track_event_process_table(); + auto it_and_ins = + upid_to_row_.Insert(upid, tables::AndroidTrackEventProcessTable::Id{0}); + if (it_and_ins.second) { + tables::AndroidTrackEventProcessTable::Row row; + row.upid = upid; + *it_and_ins.first = table->Insert(row).id; + } + return (*table)[*it_and_ins.first]; + } + + void HandleProcessStart(protozero::ConstBytes data, int64_t ts) { + AndroidProcessStartEvent::Decoder evt(data); + if (!evt.has_pid()) + return; + UniquePid upid = context_->process_tracker->GetOrCreateProcess(evt.pid()); + SetProcessMetadata(upid, evt); + // Keep the earliest start to capture the process_bound event as opposed to + // process_start event as the first event even though they share the same + // proto. + auto row = GetOrInsertRow(upid); + if (!row.fw_start_ts().has_value()) + row.set_fw_start_ts(ts); + } + + void HandleBinderDied(protozero::ConstBytes data, int64_t ts) { + AndroidBinderDiedEvent::Decoder evt(data); + if (!evt.has_pid()) + return; + // Resolve the process without creating one. If ftrace sched already ended + // it (freeing the pid), GetOrCreateProcess would resurrect a phantom + // process, so look it up via its still-tracked main thread instead and + // bail if the process is already gone. + std::optional<UniqueTid> utid = + context_->process_tracker->GetThreadOrNull(evt.pid()); + if (!utid) + return; + std::optional<UniquePid> upid = + context_->storage->thread_table()[*utid].upid(); + if (!upid) + return; + GetOrInsertRow(*upid).set_fw_end_ts(ts); + // End the process so its pid is freed for reuse. With only an initial + // ftrace snapshot (no ongoing sched) this is the sole signal that ends it. + context_->process_tracker->EndThread(ts, evt.pid()); + } + + TraceProcessorContext* context_; + base::FlatHashMap<UniquePid, tables::AndroidTrackEventProcessTable::Id> + upid_to_row_; +}; + +class AndroidFrameworkTrackEventPlugin + : public Plugin<AndroidFrameworkTrackEventPlugin> { + public: + ~AndroidFrameworkTrackEventPlugin() override; + + void RegisterProtoImporterModules( + ProtoImporterModuleContext* module_context, + TraceProcessorContext* trace_context) override { + module_context->track_event_plugins.Register( + std::make_unique<Parser>(trace_context), + {FBTE::kProcessStartEventFieldNumber, + FBTE::kBinderDiedEventFieldNumber}); + } +}; + +AndroidFrameworkTrackEventPlugin::~AndroidFrameworkTrackEventPlugin() = default; + +} // namespace + +void RegisterPlugin() { + static PluginRegistration reg( + []() -> std::unique_ptr<PluginBase> { + return std::make_unique<AndroidFrameworkTrackEventPlugin>(); + }, + AndroidFrameworkTrackEventPlugin::kPluginId, + AndroidFrameworkTrackEventPlugin::kDepIds.data(), + AndroidFrameworkTrackEventPlugin::kDepIds.size()); + base::ignore_result(reg); +} + +} // namespace perfetto::trace_processor::android_framework_track_event
diff --git a/src/trace_processor/plugins/android_framework_track_event/android_framework_track_event.h b/src/trace_processor/plugins/android_framework_track_event/android_framework_track_event.h new file mode 100644 index 0000000..0f7a4fc --- /dev/null +++ b/src/trace_processor/plugins/android_framework_track_event/android_framework_track_event.h
@@ -0,0 +1,28 @@ +/* + * Copyright (C) 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SRC_TRACE_PROCESSOR_PLUGINS_ANDROID_FRAMEWORK_TRACK_EVENT_ANDROID_FRAMEWORK_TRACK_EVENT_H_ +#define SRC_TRACE_PROCESSOR_PLUGINS_ANDROID_FRAMEWORK_TRACK_EVENT_ANDROID_FRAMEWORK_TRACK_EVENT_H_ + +namespace perfetto::trace_processor::android_framework_track_event { + +// Records AndroidProcessStartEvent / AndroidBinderDiedEvent TrackEvents into +// __intrinsic_android_track_event_process. Called from trace_processor_impl.cc. +void RegisterPlugin(); + +} // namespace perfetto::trace_processor::android_framework_track_event + +#endif // SRC_TRACE_PROCESSOR_PLUGINS_ANDROID_FRAMEWORK_TRACK_EVENT_ANDROID_FRAMEWORK_TRACK_EVENT_H_
diff --git a/src/trace_processor/plugins/storage_tables/storage_tables.cc b/src/trace_processor/plugins/storage_tables/storage_tables.cc index a4d7cb6..3cb75c0 100644 --- a/src/trace_processor/plugins/storage_tables/storage_tables.cc +++ b/src/trace_processor/plugins/storage_tables/storage_tables.cc
@@ -158,6 +158,7 @@ AddDataframe(out, s->mutable_jit_frame_table()); AddDataframe(out, s->mutable_android_key_events_table()); AddDataframe(out, s->mutable_android_motion_events_table()); + AddDataframe(out, s->mutable_android_track_event_process_table()); AddDataframe(out, s->mutable_android_input_event_dispatch_table()); AddDataframe(out, s->mutable_inputmethod_clients_table()); AddDataframe(out, s->mutable_inputmethod_manager_service_table());
diff --git a/src/trace_processor/storage/trace_storage.h b/src/trace_processor/storage/trace_storage.h index 9db8894..59a139f 100644 --- a/src/trace_processor/storage/trace_storage.h +++ b/src/trace_processor/storage/trace_storage.h
@@ -369,6 +369,15 @@ return mutable_table<tables::AndroidMotionEventsTable>(); } + const tables::AndroidTrackEventProcessTable& + android_track_event_process_table() const { + return table<tables::AndroidTrackEventProcessTable>(); + } + tables::AndroidTrackEventProcessTable* + mutable_android_track_event_process_table() { + return mutable_table<tables::AndroidTrackEventProcessTable>(); + } + const tables::AndroidInputEventDispatchTable& android_input_event_dispatch_table() const { return table<tables::AndroidInputEventDispatchTable>();
diff --git a/src/trace_processor/tables/android_tables.py b/src/trace_processor/tables/android_tables.py index 214f118..52606f4 100644 --- a/src/trace_processor/tables/android_tables.py +++ b/src/trace_processor/tables/android_tables.py
@@ -29,6 +29,7 @@ from python.generators.trace_processor_table.public import TableDoc from python.generators.trace_processor_table.public import WrappingSqlView +from src.trace_processor.tables.metadata_tables import PROCESS_TABLE from src.trace_processor.tables.track_tables import TRACK_TABLE ANDROID_CPU_PER_UID_TRACK_TABLE = Table( @@ -368,6 +369,30 @@ ), ) +ANDROID_TRACK_EVENT_PROCESS_TABLE = Table( + python_module=__file__, + class_name='AndroidTrackEventProcessTable', + sql_name='__intrinsic_android_track_event_process', + columns=[ + C('upid', CppTableId(PROCESS_TABLE), cpp_access=CppAccess.READ), + C('fw_start_ts', + CppOptional(CppInt64()), + cpp_access=CppAccess.READ_AND_HIGH_PERF_WRITE), + C('fw_end_ts', + CppOptional(CppInt64()), + cpp_access=CppAccess.READ_AND_HIGH_PERF_WRITE), + ], + tabledoc=TableDoc( + doc='Per-process lifecycle from Android framework TrackEvents.', + group='Android', + columns={ + 'upid': 'The process this row describes.', + 'fw_start_ts': 'Timestamp of AndroidProcessStartEvent.', + 'fw_end_ts': 'Timestamp of AndroidBinderDiedEvent.', + }, + ), +) + # Keep this list sorted. ALL_TABLES = [ ANDROID_AFLAGS_TABLE, @@ -377,5 +402,6 @@ ANDROID_INPUT_EVENT_DISPATCH_TABLE, ANDROID_KEY_EVENTS_TABLE, ANDROID_MOTION_EVENTS_TABLE, + ANDROID_TRACK_EVENT_PROCESS_TABLE, ANDROID_USER_LIST_TABLE, ]
diff --git a/src/trace_processor/trace_processor_impl.cc b/src/trace_processor/trace_processor_impl.cc index a4a63f4..8a76606 100644 --- a/src/trace_processor/trace_processor_impl.cc +++ b/src/trace_processor/trace_processor_impl.cc
@@ -86,6 +86,7 @@ #include "src/trace_processor/perfetto_sql/engine/perfetto_sql_connection.h" #include "src/trace_processor/perfetto_sql/stdlib/stdlib.h" #include "src/trace_processor/plugins/ancestor/ancestor.h" +#include "src/trace_processor/plugins/android_framework_track_event/android_framework_track_event.h" #include "src/trace_processor/plugins/args/args.h" #include "src/trace_processor/plugins/art_heap_graph_functions/art_heap_graph_functions.h" #include "src/trace_processor/plugins/base64_functions/base64_functions.h" @@ -315,6 +316,7 @@ // we call here before GetPluginSet() builds its cached set. Remove these // explicit calls once the static-init based registration is restored. ancestor::RegisterPlugin(); + android_framework_track_event::RegisterPlugin(); args::RegisterPlugin(); art_heap_graph_functions::RegisterPlugin(); base64_functions::RegisterPlugin();