[tp] Make chrome ActiveProcesses a part of track event

This is necessary to unblock aosp/2267925.

We need to get rid of AddParsingOverrideForField for active_processes.pid, but there's no other way to parse track event extensions at the moment. So this field needs to move from extensions to "core" track event proto.

Bug: 255295843
Change-Id: I2457dd01115088c3815ec4c91d6e98ae993acb93
diff --git a/Android.bp b/Android.bp
index 4f9a16ab..99c4687 100644
--- a/Android.bp
+++ b/Android.bp
@@ -4823,6 +4823,7 @@
         "protos/perfetto/trace/trace.proto",
         "protos/perfetto/trace/trace_packet.proto",
         "protos/perfetto/trace/trace_packet_defaults.proto",
+        "protos/perfetto/trace/track_event/chrome_active_processes.proto",
         "protos/perfetto/trace/track_event/chrome_application_state_info.proto",
         "protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.proto",
         "protos/perfetto/trace/track_event/chrome_content_settings_event_info.proto",
@@ -7278,6 +7279,7 @@
 genrule {
     name: "perfetto_protos_perfetto_trace_track_event_cpp_gen",
     srcs: [
+        "protos/perfetto/trace/track_event/chrome_active_processes.proto",
         "protos/perfetto/trace/track_event/chrome_application_state_info.proto",
         "protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.proto",
         "protos/perfetto/trace/track_event/chrome_content_settings_event_info.proto",
@@ -7309,6 +7311,7 @@
     ],
     cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --plugin=protoc-gen-plugin=$(location perfetto_src_protozero_protoc_plugin_cppgen_plugin) --plugin_out=wrapper_namespace=gen:$(genDir)/external/perfetto/ $(in)",
     out: [
+        "external/perfetto/protos/perfetto/trace/track_event/chrome_active_processes.gen.cc",
         "external/perfetto/protos/perfetto/trace/track_event/chrome_application_state_info.gen.cc",
         "external/perfetto/protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.gen.cc",
         "external/perfetto/protos/perfetto/trace/track_event/chrome_content_settings_event_info.gen.cc",
@@ -7340,6 +7343,7 @@
 genrule {
     name: "perfetto_protos_perfetto_trace_track_event_cpp_gen_headers",
     srcs: [
+        "protos/perfetto/trace/track_event/chrome_active_processes.proto",
         "protos/perfetto/trace/track_event/chrome_application_state_info.proto",
         "protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.proto",
         "protos/perfetto/trace/track_event/chrome_content_settings_event_info.proto",
@@ -7371,6 +7375,7 @@
     ],
     cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --plugin=protoc-gen-plugin=$(location perfetto_src_protozero_protoc_plugin_cppgen_plugin) --plugin_out=wrapper_namespace=gen:$(genDir)/external/perfetto/ $(in)",
     out: [
+        "external/perfetto/protos/perfetto/trace/track_event/chrome_active_processes.gen.h",
         "external/perfetto/protos/perfetto/trace/track_event/chrome_application_state_info.gen.h",
         "external/perfetto/protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.gen.h",
         "external/perfetto/protos/perfetto/trace/track_event/chrome_content_settings_event_info.gen.h",
@@ -7406,6 +7411,7 @@
 genrule {
     name: "perfetto_protos_perfetto_trace_track_event_descriptor",
     srcs: [
+        "protos/perfetto/trace/track_event/chrome_active_processes.proto",
         "protos/perfetto/trace/track_event/chrome_application_state_info.proto",
         "protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.proto",
         "protos/perfetto/trace/track_event/chrome_content_settings_event_info.proto",
@@ -7444,6 +7450,7 @@
 genrule {
     name: "perfetto_protos_perfetto_trace_track_event_lite_gen",
     srcs: [
+        "protos/perfetto/trace/track_event/chrome_active_processes.proto",
         "protos/perfetto/trace/track_event/chrome_application_state_info.proto",
         "protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.proto",
         "protos/perfetto/trace/track_event/chrome_content_settings_event_info.proto",
@@ -7474,6 +7481,7 @@
     ],
     cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --cpp_out=lite=true:$(genDir)/external/perfetto/ $(in)",
     out: [
+        "external/perfetto/protos/perfetto/trace/track_event/chrome_active_processes.pb.cc",
         "external/perfetto/protos/perfetto/trace/track_event/chrome_application_state_info.pb.cc",
         "external/perfetto/protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.pb.cc",
         "external/perfetto/protos/perfetto/trace/track_event/chrome_content_settings_event_info.pb.cc",
@@ -7505,6 +7513,7 @@
 genrule {
     name: "perfetto_protos_perfetto_trace_track_event_lite_gen_headers",
     srcs: [
+        "protos/perfetto/trace/track_event/chrome_active_processes.proto",
         "protos/perfetto/trace/track_event/chrome_application_state_info.proto",
         "protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.proto",
         "protos/perfetto/trace/track_event/chrome_content_settings_event_info.proto",
@@ -7535,6 +7544,7 @@
     ],
     cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --cpp_out=lite=true:$(genDir)/external/perfetto/ $(in)",
     out: [
+        "external/perfetto/protos/perfetto/trace/track_event/chrome_active_processes.pb.h",
         "external/perfetto/protos/perfetto/trace/track_event/chrome_application_state_info.pb.h",
         "external/perfetto/protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.pb.h",
         "external/perfetto/protos/perfetto/trace/track_event/chrome_content_settings_event_info.pb.h",
@@ -7570,6 +7580,7 @@
 genrule {
     name: "perfetto_protos_perfetto_trace_track_event_zero_gen",
     srcs: [
+        "protos/perfetto/trace/track_event/chrome_active_processes.proto",
         "protos/perfetto/trace/track_event/chrome_application_state_info.proto",
         "protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.proto",
         "protos/perfetto/trace/track_event/chrome_content_settings_event_info.proto",
@@ -7601,6 +7612,7 @@
     ],
     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/ $(in)",
     out: [
+        "external/perfetto/protos/perfetto/trace/track_event/chrome_active_processes.pbzero.cc",
         "external/perfetto/protos/perfetto/trace/track_event/chrome_application_state_info.pbzero.cc",
         "external/perfetto/protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.pbzero.cc",
         "external/perfetto/protos/perfetto/trace/track_event/chrome_content_settings_event_info.pbzero.cc",
@@ -7632,6 +7644,7 @@
 genrule {
     name: "perfetto_protos_perfetto_trace_track_event_zero_gen_headers",
     srcs: [
+        "protos/perfetto/trace/track_event/chrome_active_processes.proto",
         "protos/perfetto/trace/track_event/chrome_application_state_info.proto",
         "protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.proto",
         "protos/perfetto/trace/track_event/chrome_content_settings_event_info.proto",
@@ -7663,6 +7676,7 @@
     ],
     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/ $(in)",
     out: [
+        "external/perfetto/protos/perfetto/trace/track_event/chrome_active_processes.pbzero.h",
         "external/perfetto/protos/perfetto/trace/track_event/chrome_application_state_info.pbzero.h",
         "external/perfetto/protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.pbzero.h",
         "external/perfetto/protos/perfetto/trace/track_event/chrome_content_settings_event_info.pbzero.h",
@@ -7804,6 +7818,7 @@
 genrule {
     name: "perfetto_protos_third_party_chromium_descriptor",
     srcs: [
+        "protos/perfetto/trace/track_event/chrome_active_processes.proto",
         "protos/perfetto/trace/track_event/chrome_application_state_info.proto",
         "protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.proto",
         "protos/perfetto/trace/track_event/chrome_content_settings_event_info.proto",
@@ -10682,6 +10697,7 @@
         "protos/perfetto/trace/trace.proto",
         "protos/perfetto/trace/trace_packet.proto",
         "protos/perfetto/trace/trace_packet_defaults.proto",
+        "protos/perfetto/trace/track_event/chrome_active_processes.proto",
         "protos/perfetto/trace/track_event/chrome_application_state_info.proto",
         "protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.proto",
         "protos/perfetto/trace/track_event/chrome_content_settings_event_info.proto",
diff --git a/BUILD b/BUILD
index d81c6ee..0b6a285 100644
--- a/BUILD
+++ b/BUILD
@@ -3889,6 +3889,7 @@
 perfetto_proto_library(
     name = "protos_perfetto_trace_track_event_protos",
     srcs = [
+        "protos/perfetto/trace/track_event/chrome_active_processes.proto",
         "protos/perfetto/trace/track_event/chrome_application_state_info.proto",
         "protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.proto",
         "protos/perfetto/trace/track_event/chrome_content_settings_event_info.proto",
diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto
index 016c5b8..cd0f208 100644
--- a/protos/perfetto/trace/perfetto_trace.proto
+++ b/protos/perfetto/trace/perfetto_trace.proto
@@ -8446,6 +8446,14 @@
 
 // End of protos/perfetto/trace/track_event/source_location.proto
 
+// Begin of protos/perfetto/trace/track_event/chrome_active_processes.proto
+
+// A list of processes connected to the tracing service.
+message ChromeActiveProcesses {
+  repeated int32 pid = 1;
+}
+// End of protos/perfetto/trace/track_event/chrome_active_processes.proto
+
 // Begin of protos/perfetto/trace/track_event/chrome_application_state_info.proto
 
 
@@ -9142,7 +9150,7 @@
 // their default track association) can be emitted as part of a
 // TrackEventDefaults message.
 //
-// Next reserved id: 13 (up to 15). Next id: 49.
+// Next reserved id: 13 (up to 15). Next id: 50.
 message TrackEvent {
   // Names of categories of the event. In the client library, categories are a
   // way to turn groups of individual events on or off.
@@ -9294,6 +9302,7 @@
   optional ChromeWindowHandleEventInfo chrome_window_handle_event_info = 41;
   optional ChromeContentSettingsEventInfo chrome_content_settings_event_info =
       43;
+  optional ChromeActiveProcesses chrome_active_processes = 49;
 
   // This field is used only if the source location represents the function that
   // executes during this event.
diff --git a/protos/perfetto/trace/track_event/BUILD.gn b/protos/perfetto/trace/track_event/BUILD.gn
index ab9d273..5f53bf9 100644
--- a/protos/perfetto/trace/track_event/BUILD.gn
+++ b/protos/perfetto/trace/track_event/BUILD.gn
@@ -16,6 +16,7 @@
 
 perfetto_proto_library("@TYPE@") {
   sources = [
+    "chrome_active_processes.proto",
     "chrome_application_state_info.proto",
     "chrome_compositor_scheduler_state.proto",
     "chrome_content_settings_event_info.proto",
diff --git a/protos/perfetto/trace/track_event/chrome_active_processes.proto b/protos/perfetto/trace/track_event/chrome_active_processes.proto
new file mode 100644
index 0000000..e229d77
--- /dev/null
+++ b/protos/perfetto/trace/track_event/chrome_active_processes.proto
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2022 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.
+ */
+
+syntax = "proto2";
+
+package perfetto.protos;
+
+// A list of processes connected to the tracing service.
+message ChromeActiveProcesses {
+  repeated int32 pid = 1;
+}
\ No newline at end of file
diff --git a/protos/perfetto/trace/track_event/track_event.proto b/protos/perfetto/trace/track_event/track_event.proto
index 66ebb4a..e57e014 100644
--- a/protos/perfetto/trace/track_event/track_event.proto
+++ b/protos/perfetto/trace/track_event/track_event.proto
@@ -19,6 +19,7 @@
 import "protos/perfetto/trace/track_event/debug_annotation.proto";
 import "protos/perfetto/trace/track_event/log_message.proto";
 import "protos/perfetto/trace/track_event/task_execution.proto";
+import "protos/perfetto/trace/track_event/chrome_active_processes.proto";
 import "protos/perfetto/trace/track_event/chrome_application_state_info.proto";
 import "protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.proto";
 import "protos/perfetto/trace/track_event/chrome_content_settings_event_info.proto";
@@ -101,7 +102,7 @@
 // their default track association) can be emitted as part of a
 // TrackEventDefaults message.
 //
-// Next reserved id: 13 (up to 15). Next id: 49.
+// Next reserved id: 13 (up to 15). Next id: 50.
 message TrackEvent {
   // Names of categories of the event. In the client library, categories are a
   // way to turn groups of individual events on or off.
@@ -253,6 +254,7 @@
   optional ChromeWindowHandleEventInfo chrome_window_handle_event_info = 41;
   optional ChromeContentSettingsEventInfo chrome_content_settings_event_info =
       43;
+  optional ChromeActiveProcesses chrome_active_processes = 49;
 
   // This field is used only if the source location represents the function that
   // executes during this event.
diff --git a/src/trace_processor/importers/proto/track_event_parser.cc b/src/trace_processor/importers/proto/track_event_parser.cc
index 9f3f611..c52e69b 100644
--- a/src/trace_processor/importers/proto/track_event_parser.cc
+++ b/src/trace_processor/importers/proto/track_event_parser.cc
@@ -39,6 +39,7 @@
 
 #include "protos/perfetto/trace/extension_descriptor.pbzero.h"
 #include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
+#include "protos/perfetto/trace/track_event/chrome_active_processes.pbzero.h"
 #include "protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.pbzero.h"
 #include "protos/perfetto/trace/track_event/chrome_histogram_sample.pbzero.h"
 #include "protos/perfetto/trace/track_event/chrome_legacy_ipc.pbzero.h"
@@ -1182,6 +1183,13 @@
       log_errors(
           ParseHistogramName(event_.chrome_histogram_sample(), inserter));
     }
+    if (event_.has_chrome_active_processes()) {
+      protos::pbzero::ChromeActiveProcesses::Decoder message(
+          event_.chrome_active_processes());
+      for (auto it = message.pid(); it; ++it) {
+        parser_->AddActiveProcess(ts_, *it);
+      }
+    }
 
     TrackEventArgsParser args_writer(ts_, *inserter, *storage_,
                                      *sequence_state_);
@@ -1529,10 +1537,7 @@
   args_parser_.AddParsingOverrideForField(
       "active_processes.pid", [&](const protozero::Field& field,
                                   util::ProtoToArgsParser::Delegate& delegate) {
-        UniquePid upid = context_->process_tracker->GetOrCreateProcess(
-            static_cast<uint32_t>(field.as_int32()));
-        active_chrome_processes_tracker_.AddActiveProcessMetadata(
-            delegate.packet_timestamp(), upid);
+        AddActiveProcess(delegate.packet_timestamp(), field.as_int32());
         // Fallthrough so that the parser adds pid as a regular arg.
         return base::nullopt;
       });
@@ -1719,6 +1724,13 @@
   }
 }
 
+void TrackEventParser::AddActiveProcess(int64_t packet_timestamp, int32_t pid) {
+  UniquePid upid =
+      context_->process_tracker->GetOrCreateProcess(static_cast<uint32_t>(pid));
+  active_chrome_processes_tracker_.AddActiveProcessMetadata(packet_timestamp,
+                                                            upid);
+}
+
 void TrackEventParser::NotifyEndOfFile() {
   active_chrome_processes_tracker_.NotifyEndOfFile();
 }
diff --git a/src/trace_processor/importers/proto/track_event_parser.h b/src/trace_processor/importers/proto/track_event_parser.h
index 72b3bf3..52489d9 100644
--- a/src/trace_processor/importers/proto/track_event_parser.h
+++ b/src/trace_processor/importers/proto/track_event_parser.h
@@ -45,7 +45,7 @@
 // TODO(ddrone): replace with a predicate on field id to import new fields
 // automatically
 static constexpr uint16_t kReflectFields[] = {24, 25, 26, 27, 28, 29, 32, 33,
-                                              34, 35, 38, 39, 40, 41, 43};
+                                              34, 35, 38, 39, 40, 41, 43, 49};
 
 class PacketSequenceStateGeneration;
 class TraceProcessorContext;
@@ -75,6 +75,7 @@
   void ParseChromeProcessDescriptor(UniquePid, protozero::ConstBytes);
   void ParseChromeThreadDescriptor(UniqueTid, protozero::ConstBytes);
   void ParseCounterDescriptor(TrackId, protozero::ConstBytes);
+  void AddActiveProcess(int64_t packet_timestamp, int32_t pid);
 
   // Reflection-based proto TrackEvent field parser.
   util::ProtoToArgsParser args_parser_;
diff --git a/test/trace_processor/chrome/chrome_missing_processes.textproto b/test/trace_processor/chrome/chrome_missing_processes.textproto
index 5f62e09..9db490d 100644
--- a/test/trace_processor/chrome/chrome_missing_processes.textproto
+++ b/test/trace_processor/chrome/chrome_missing_processes.textproto
@@ -5,7 +5,7 @@
   track_event {
     type: TYPE_INSTANT
     name: "ActiveProcesses"
-    [perfetto.protos.ChromeTrackEvent.active_processes]: {
+    chrome_active_processes {
       pid: 10
       pid: 100
       pid: 1000
diff --git a/test/trace_processor/chrome/chrome_missing_processes_args.out b/test/trace_processor/chrome/chrome_missing_processes_args.out
index acc7c28..e66f55e 100644
--- a/test/trace_processor/chrome/chrome_missing_processes_args.out
+++ b/test/trace_processor/chrome/chrome_missing_processes_args.out
@@ -1,4 +1,4 @@
 "arg_set_id","key","int_value"
-2,"active_processes.pid[0]",10
-2,"active_processes.pid[1]",100
-2,"active_processes.pid[2]",1000
+2,"chrome_active_processes.pid[0]",10
+2,"chrome_active_processes.pid[1]",100
+2,"chrome_active_processes.pid[2]",1000
diff --git a/test/trace_processor/chrome/chrome_missing_processes_extension.textproto b/test/trace_processor/chrome/chrome_missing_processes_extension.textproto
new file mode 100644
index 0000000..5f62e09
--- /dev/null
+++ b/test/trace_processor/chrome/chrome_missing_processes_extension.textproto
@@ -0,0 +1,36 @@
+packet {
+  timestamp: 1
+  incremental_state_cleared: true
+  trusted_packet_sequence_id: 1
+  track_event {
+    type: TYPE_INSTANT
+    name: "ActiveProcesses"
+    [perfetto.protos.ChromeTrackEvent.active_processes]: {
+      pid: 10
+      pid: 100
+      pid: 1000
+    }
+  }
+}
+packet {
+  timestamp: 1
+  trusted_packet_sequence_id: 2
+  track_descriptor {
+    uuid: 1
+    process {
+      pid: 10
+    }
+    parent_uuid: 0
+  }
+}
+packet {
+  timestamp: 1000000000
+  trusted_packet_sequence_id: 3
+  track_descriptor {
+    uuid: 2
+    process {
+      pid: 100
+    }
+    parent_uuid: 0
+  }
+}
\ No newline at end of file
diff --git a/test/trace_processor/chrome/chrome_missing_processes_extension_args.out b/test/trace_processor/chrome/chrome_missing_processes_extension_args.out
new file mode 100644
index 0000000..acc7c28
--- /dev/null
+++ b/test/trace_processor/chrome/chrome_missing_processes_extension_args.out
@@ -0,0 +1,4 @@
+"arg_set_id","key","int_value"
+2,"active_processes.pid[0]",10
+2,"active_processes.pid[1]",100
+2,"active_processes.pid[2]",1000
diff --git a/test/trace_processor/chrome/index b/test/trace_processor/chrome/index
index 8bff222..0dcd235 100644
--- a/test/trace_processor/chrome/index
+++ b/test/trace_processor/chrome/index
@@ -100,3 +100,5 @@
 ../../data/chrome_scroll_without_vsync.pftrace chrome_missing_processes_test.sql chrome_missing_processes_default_trace.out
 chrome_missing_processes.textproto chrome_missing_processes_test.sql chrome_missing_processes.out
 chrome_missing_processes.textproto chrome_missing_processes_args_test.sql chrome_missing_processes_args.out
+chrome_missing_processes_extension.textproto chrome_missing_processes_test.sql chrome_missing_processes.out
+chrome_missing_processes_extension.textproto chrome_missing_processes_args_test.sql chrome_missing_processes_extension_args.out