[trace-processor] Add importer for Instruments XML files

This adds an importer for Instruments XML files, as exported from an
Instruments trace with `xtrace export` (see code comments for the exact
command line and XML format).

Specifically, the XML tokenizer parses the XML into time sample Row data
structures, which are inserted into the sorter and then semi-trivially
parsed after sorting into frames, callsites, and samples. Row timestamps
are relative to the start of Instruments profiling -- there is support
for clock sync events in the profile to sync these timestamps against
Perfetto's boottime clock.

The XML parsing requires pulling in a dependency on libexpat, which is a
third-party streaming XML parser.

Bug: 362665903
Change-Id: I7e638f0b3c7275214aef3410f6263fb75e3968ac
diff --git a/Android.bp b/Android.bp
index d60a652..ee4e0fd 100644
--- a/Android.bp
+++ b/Android.bp
@@ -2412,6 +2412,8 @@
         ":perfetto_src_trace_processor_importers_fuchsia_minimal",
         ":perfetto_src_trace_processor_importers_gzip_full",
         ":perfetto_src_trace_processor_importers_i2c_full",
+        ":perfetto_src_trace_processor_importers_instruments_instruments",
+        ":perfetto_src_trace_processor_importers_instruments_row",
         ":perfetto_src_trace_processor_importers_json_full",
         ":perfetto_src_trace_processor_importers_json_minimal",
         ":perfetto_src_trace_processor_importers_memory_tracker_graph_processor",
@@ -2512,6 +2514,7 @@
     shared_libs: [
         "heapprofd_client_api",
         "libbase",
+        "libexpat",
         "libicu",
         "liblog",
         "libprocinfo",
@@ -12407,6 +12410,21 @@
     ],
 }
 
+// GN: //src/trace_processor/importers/instruments:instruments
+filegroup {
+    name: "perfetto_src_trace_processor_importers_instruments_instruments",
+    srcs: [
+        "src/trace_processor/importers/instruments/instruments_xml_tokenizer.cc",
+        "src/trace_processor/importers/instruments/row_data_tracker.cc",
+        "src/trace_processor/importers/instruments/row_parser.cc",
+    ],
+}
+
+// GN: //src/trace_processor/importers/instruments:row
+filegroup {
+    name: "perfetto_src_trace_processor_importers_instruments_row",
+}
+
 // GN: //src/trace_processor/importers/json:full
 filegroup {
     name: "perfetto_src_trace_processor_importers_json_full",
@@ -15310,6 +15328,8 @@
         ":perfetto_src_trace_processor_importers_fuchsia_unittests",
         ":perfetto_src_trace_processor_importers_gzip_full",
         ":perfetto_src_trace_processor_importers_i2c_full",
+        ":perfetto_src_trace_processor_importers_instruments_instruments",
+        ":perfetto_src_trace_processor_importers_instruments_row",
         ":perfetto_src_trace_processor_importers_json_full",
         ":perfetto_src_trace_processor_importers_json_minimal",
         ":perfetto_src_trace_processor_importers_memory_tracker_graph_processor",
@@ -15449,6 +15469,7 @@
     ],
     shared_libs: [
         "libbase",
+        "libexpat",
         "libicu",
         "liblog",
         "libprocinfo",
@@ -16284,8 +16305,11 @@
         ":perfetto_include_perfetto_ext_traced_sys_stats_counters",
         ":perfetto_include_perfetto_protozero_protozero",
         ":perfetto_include_perfetto_public_abi_base",
+        ":perfetto_include_perfetto_public_abi_public",
         ":perfetto_include_perfetto_public_base",
+        ":perfetto_include_perfetto_public_protos_protos",
         ":perfetto_include_perfetto_public_protozero",
+        ":perfetto_include_perfetto_public_public",
         ":perfetto_include_perfetto_trace_processor_basic_types",
         ":perfetto_include_perfetto_trace_processor_storage",
         ":perfetto_include_perfetto_trace_processor_trace_processor",
@@ -16359,6 +16383,8 @@
         ":perfetto_src_trace_processor_importers_fuchsia_minimal",
         ":perfetto_src_trace_processor_importers_gzip_full",
         ":perfetto_src_trace_processor_importers_i2c_full",
+        ":perfetto_src_trace_processor_importers_instruments_instruments",
+        ":perfetto_src_trace_processor_importers_instruments_row",
         ":perfetto_src_trace_processor_importers_json_full",
         ":perfetto_src_trace_processor_importers_json_minimal",
         ":perfetto_src_trace_processor_importers_memory_tracker_graph_processor",
@@ -16492,6 +16518,7 @@
     target: {
         android: {
             shared_libs: [
+                "libexpat",
                 "libicu",
                 "liblog",
                 "libprotobuf-cpp-full",
@@ -16505,6 +16532,7 @@
         },
         host: {
             static_libs: [
+                "libexpat",
                 "libprotobuf-cpp-full",
                 "libsqlite_static_noicu",
                 "libz",
@@ -16589,6 +16617,7 @@
         ":perfetto_src_trace_processor_importers_etw_minimal",
         ":perfetto_src_trace_processor_importers_ftrace_minimal",
         ":perfetto_src_trace_processor_importers_fuchsia_fuchsia_record",
+        ":perfetto_src_trace_processor_importers_instruments_row",
         ":perfetto_src_trace_processor_importers_json_minimal",
         ":perfetto_src_trace_processor_importers_memory_tracker_graph_processor",
         ":perfetto_src_trace_processor_importers_perf_record",
@@ -16689,8 +16718,11 @@
         ":perfetto_include_perfetto_profiling_pprof_builder",
         ":perfetto_include_perfetto_protozero_protozero",
         ":perfetto_include_perfetto_public_abi_base",
+        ":perfetto_include_perfetto_public_abi_public",
         ":perfetto_include_perfetto_public_base",
+        ":perfetto_include_perfetto_public_protos_protos",
         ":perfetto_include_perfetto_public_protozero",
+        ":perfetto_include_perfetto_public_public",
         ":perfetto_include_perfetto_trace_processor_basic_types",
         ":perfetto_include_perfetto_trace_processor_storage",
         ":perfetto_include_perfetto_trace_processor_trace_processor",
@@ -16762,6 +16794,8 @@
         ":perfetto_src_trace_processor_importers_fuchsia_minimal",
         ":perfetto_src_trace_processor_importers_gzip_full",
         ":perfetto_src_trace_processor_importers_i2c_full",
+        ":perfetto_src_trace_processor_importers_instruments_instruments",
+        ":perfetto_src_trace_processor_importers_instruments_row",
         ":perfetto_src_trace_processor_importers_json_full",
         ":perfetto_src_trace_processor_importers_json_minimal",
         ":perfetto_src_trace_processor_importers_memory_tracker_graph_processor",
@@ -16821,6 +16855,7 @@
         ":perfetto_src_traceconv_utils",
     ],
     static_libs: [
+        "libexpat",
         "libsqlite_static_noicu",
         "libz",
         "perfetto_src_trace_processor_demangle",