Added .proto and targets for minimal 'lite' TracePacket for Chrome

Bug: 78791178

Change-Id: Iebc458505015ab0cdafcf54f8206fae004bae690
diff --git a/Android.bp b/Android.bp
index 65684ee..0579556 100644
--- a/Android.bp
+++ b/Android.bp
@@ -27,6 +27,7 @@
     ":perfetto_protos_perfetto_trace_ftrace_zero_gen",
     ":perfetto_protos_perfetto_trace_minimal_lite_gen",
     ":perfetto_protos_perfetto_trace_ps_zero_gen",
+    ":perfetto_protos_perfetto_trace_trusted_lite_gen",
     ":perfetto_protos_perfetto_trace_zero_gen",
     ":perfetto_src_ipc_wire_protocol_gen",
     "src/base/file_utils.cc",
@@ -110,6 +111,7 @@
     "perfetto_protos_perfetto_trace_ftrace_zero_gen_headers",
     "perfetto_protos_perfetto_trace_minimal_lite_gen_headers",
     "perfetto_protos_perfetto_trace_ps_zero_gen_headers",
+    "perfetto_protos_perfetto_trace_trusted_lite_gen_headers",
     "perfetto_protos_perfetto_trace_zero_gen_headers",
     "perfetto_src_ipc_wire_protocol_gen_headers",
   ],
@@ -135,6 +137,7 @@
     ":perfetto_protos_perfetto_trace_ftrace_zero_gen",
     ":perfetto_protos_perfetto_trace_minimal_lite_gen",
     ":perfetto_protos_perfetto_trace_ps_zero_gen",
+    ":perfetto_protos_perfetto_trace_trusted_lite_gen",
     ":perfetto_protos_perfetto_trace_zero_gen",
     ":perfetto_src_ipc_wire_protocol_gen",
     ":perfetto_src_perfetto_cmd_protos_gen",
@@ -208,6 +211,7 @@
     "perfetto_protos_perfetto_trace_ftrace_zero_gen_headers",
     "perfetto_protos_perfetto_trace_minimal_lite_gen_headers",
     "perfetto_protos_perfetto_trace_ps_zero_gen_headers",
+    "perfetto_protos_perfetto_trace_trusted_lite_gen_headers",
     "perfetto_protos_perfetto_trace_zero_gen_headers",
     "perfetto_src_ipc_wire_protocol_gen_headers",
     "perfetto_src_perfetto_cmd_protos_gen_headers",
@@ -260,6 +264,7 @@
     ":perfetto_protos_perfetto_trace_minimal_lite_gen",
     ":perfetto_protos_perfetto_trace_ps_lite_gen",
     ":perfetto_protos_perfetto_trace_ps_zero_gen",
+    ":perfetto_protos_perfetto_trace_trusted_lite_gen",
     ":perfetto_protos_perfetto_trace_zero_gen",
     ":perfetto_src_ipc_wire_protocol_gen",
     "src/base/android_task_runner.cc",
@@ -359,6 +364,7 @@
     "perfetto_protos_perfetto_trace_minimal_lite_gen_headers",
     "perfetto_protos_perfetto_trace_ps_lite_gen_headers",
     "perfetto_protos_perfetto_trace_ps_zero_gen_headers",
+    "perfetto_protos_perfetto_trace_trusted_lite_gen_headers",
     "perfetto_protos_perfetto_trace_zero_gen_headers",
     "perfetto_src_ipc_wire_protocol_gen_headers",
   ],
@@ -2932,7 +2938,6 @@
   srcs: [
     "protos/perfetto/trace/clock_snapshot.proto",
     "protos/perfetto/trace/trace_stats.proto",
-    "protos/perfetto/trace/trusted_packet.proto",
   ],
   tools: [
     "aprotoc",
@@ -2941,7 +2946,6 @@
   out: [
     "external/perfetto/protos/perfetto/trace/clock_snapshot.pb.cc",
     "external/perfetto/protos/perfetto/trace/trace_stats.pb.cc",
-    "external/perfetto/protos/perfetto/trace/trusted_packet.pb.cc",
   ],
 }
 
@@ -2951,7 +2955,6 @@
   srcs: [
     "protos/perfetto/trace/clock_snapshot.proto",
     "protos/perfetto/trace/trace_stats.proto",
-    "protos/perfetto/trace/trusted_packet.proto",
   ],
   tools: [
     "aprotoc",
@@ -2960,7 +2963,6 @@
   out: [
     "external/perfetto/protos/perfetto/trace/clock_snapshot.pb.h",
     "external/perfetto/protos/perfetto/trace/trace_stats.pb.h",
-    "external/perfetto/protos/perfetto/trace/trusted_packet.pb.h",
   ],
   export_include_dirs: [
     "protos",
@@ -3035,6 +3037,39 @@
   ],
 }
 
+// GN target: //protos/perfetto/trace:trusted_lite_gen
+genrule {
+  name: "perfetto_protos_perfetto_trace_trusted_lite_gen",
+  srcs: [
+    "protos/perfetto/trace/trusted_packet.proto",
+  ],
+  tools: [
+    "aprotoc",
+  ],
+  cmd: "mkdir -p $(genDir)/external/perfetto/protos && $(location aprotoc) --cpp_out=$(genDir)/external/perfetto/protos --proto_path=external/perfetto/protos $(in)",
+  out: [
+    "external/perfetto/protos/perfetto/trace/trusted_packet.pb.cc",
+  ],
+}
+
+// GN target: //protos/perfetto/trace:trusted_lite_gen
+genrule {
+  name: "perfetto_protos_perfetto_trace_trusted_lite_gen_headers",
+  srcs: [
+    "protos/perfetto/trace/trusted_packet.proto",
+  ],
+  tools: [
+    "aprotoc",
+  ],
+  cmd: "mkdir -p $(genDir)/external/perfetto/protos && $(location aprotoc) --cpp_out=$(genDir)/external/perfetto/protos --proto_path=external/perfetto/protos $(in)",
+  out: [
+    "external/perfetto/protos/perfetto/trace/trusted_packet.pb.h",
+  ],
+  export_include_dirs: [
+    "protos",
+  ],
+}
+
 // GN target: //protos/perfetto/trace:zero_gen
 genrule {
   name: "perfetto_protos_perfetto_trace_zero_gen",
@@ -3044,7 +3079,6 @@
     "protos/perfetto/trace/trace.proto",
     "protos/perfetto/trace/trace_packet.proto",
     "protos/perfetto/trace/trace_stats.proto",
-    "protos/perfetto/trace/trusted_packet.proto",
   ],
   tools: [
     "aprotoc",
@@ -3057,7 +3091,6 @@
     "external/perfetto/protos/perfetto/trace/trace.pbzero.cc",
     "external/perfetto/protos/perfetto/trace/trace_packet.pbzero.cc",
     "external/perfetto/protos/perfetto/trace/trace_stats.pbzero.cc",
-    "external/perfetto/protos/perfetto/trace/trusted_packet.pbzero.cc",
   ],
 }
 
@@ -3070,7 +3103,6 @@
     "protos/perfetto/trace/trace.proto",
     "protos/perfetto/trace/trace_packet.proto",
     "protos/perfetto/trace/trace_stats.proto",
-    "protos/perfetto/trace/trusted_packet.proto",
   ],
   tools: [
     "aprotoc",
@@ -3083,7 +3115,6 @@
     "external/perfetto/protos/perfetto/trace/trace.pbzero.h",
     "external/perfetto/protos/perfetto/trace/trace_packet.pbzero.h",
     "external/perfetto/protos/perfetto/trace/trace_stats.pbzero.h",
-    "external/perfetto/protos/perfetto/trace/trusted_packet.pbzero.h",
   ],
   export_include_dirs: [
     "protos",
@@ -3416,6 +3447,7 @@
     ":perfetto_protos_perfetto_trace_ftrace_zero_gen",
     ":perfetto_protos_perfetto_trace_minimal_lite_gen",
     ":perfetto_protos_perfetto_trace_ps_zero_gen",
+    ":perfetto_protos_perfetto_trace_trusted_lite_gen",
     ":perfetto_protos_perfetto_trace_zero_gen",
     ":perfetto_src_ipc_wire_protocol_gen",
     "src/base/file_utils.cc",
@@ -3487,6 +3519,7 @@
     "perfetto_protos_perfetto_trace_ftrace_zero_gen_headers",
     "perfetto_protos_perfetto_trace_minimal_lite_gen_headers",
     "perfetto_protos_perfetto_trace_ps_zero_gen_headers",
+    "perfetto_protos_perfetto_trace_trusted_lite_gen_headers",
     "perfetto_protos_perfetto_trace_zero_gen_headers",
     "perfetto_src_ipc_wire_protocol_gen_headers",
   ],
@@ -3500,6 +3533,7 @@
     "perfetto_protos_perfetto_trace_ftrace_zero_gen_headers",
     "perfetto_protos_perfetto_trace_minimal_lite_gen_headers",
     "perfetto_protos_perfetto_trace_ps_zero_gen_headers",
+    "perfetto_protos_perfetto_trace_trusted_lite_gen_headers",
     "perfetto_protos_perfetto_trace_zero_gen_headers",
     "perfetto_src_ipc_wire_protocol_gen_headers",
   ],
@@ -3577,6 +3611,7 @@
     ":perfetto_protos_perfetto_trace_minimal_lite_gen",
     ":perfetto_protos_perfetto_trace_ps_lite_gen",
     ":perfetto_protos_perfetto_trace_ps_zero_gen",
+    ":perfetto_protos_perfetto_trace_trusted_lite_gen",
     ":perfetto_protos_perfetto_trace_zero_gen",
     ":perfetto_src_ftrace_reader_ftrace_reader_test_messages_lite_gen",
     ":perfetto_src_ftrace_reader_ftrace_reader_test_messages_zero_gen",
@@ -3744,6 +3779,7 @@
     "perfetto_protos_perfetto_trace_minimal_lite_gen_headers",
     "perfetto_protos_perfetto_trace_ps_lite_gen_headers",
     "perfetto_protos_perfetto_trace_ps_zero_gen_headers",
+    "perfetto_protos_perfetto_trace_trusted_lite_gen_headers",
     "perfetto_protos_perfetto_trace_zero_gen_headers",
     "perfetto_src_ftrace_reader_ftrace_reader_test_messages_lite_gen_headers",
     "perfetto_src_ftrace_reader_ftrace_reader_test_messages_zero_gen_headers",
diff --git a/include/perfetto/tracing/core/trace_packet.h b/include/perfetto/tracing/core/trace_packet.h
index 66c5eba..3c9d44c 100644
--- a/include/perfetto/tracing/core/trace_packet.h
+++ b/include/perfetto/tracing/core/trace_packet.h
@@ -60,7 +60,7 @@
   // Decodes the packet. This function requires that the caller:
   // 1) Does #include "perfetto/trace/trace_packet.pb.h"
   // 2) Links against the //protos/trace:lite target.
-  // The core service code delierately doesn't link against that in order to
+  // The core service code deliberately doesn't link against that in order to
   // avoid binary bloat. This is the reason why this is a templated function.
   // It doesn't need to be (i.e. the caller should not specify the template
   // argument) but doing so prevents the compiler trying to resolve the
diff --git a/protos/perfetto/trace/BUILD.gn b/protos/perfetto/trace/BUILD.gn
index 64f2489..60d8259 100644
--- a/protos/perfetto/trace/BUILD.gn
+++ b/protos/perfetto/trace/BUILD.gn
@@ -21,9 +21,10 @@
 proto_sources_minimal = [
   "clock_snapshot.proto",
   "trace_stats.proto",
-  "trusted_packet.proto",
 ]
 
+proto_sources_trusted = [ "trusted_packet.proto" ]
+
 proto_sources = [
   "test_event.proto",
   "trace_packet.proto",
@@ -64,7 +65,7 @@
   proto_out_dir = "$perfetto_root_path/protos"
 }
 
-# Used by the traced service for packet sanitization.
+# Contains the subprotos of TracePacket that all targets need.
 proto_library("minimal_lite") {
   generate_python = false
   deps = [
@@ -75,6 +76,18 @@
   proto_out_dir = "$perfetto_root_path/protos"
 }
 
+# Used by the traced service for packet sanitization.
+proto_library("trusted_lite") {
+  generate_python = false
+  deps = [
+    ":minimal_lite",
+    "../config:config",
+  ]
+  sources = proto_sources_trusted
+  proto_in_dir = "$perfetto_root_path/protos"
+  proto_out_dir = "$perfetto_root_path/protos"
+}
+
 # This target is not used in the tree and is built only to guarantee that the
 # autogenerated merged proto has a valid syntax.
 proto_library("merged_trace") {
diff --git a/protos/perfetto/trace/chrome/BUILD.gn b/protos/perfetto/trace/chrome/BUILD.gn
index 6cf9a2f..4a6735f 100644
--- a/protos/perfetto/trace/chrome/BUILD.gn
+++ b/protos/perfetto/trace/chrome/BUILD.gn
@@ -16,6 +16,7 @@
 import("../../../../src/protozero/protozero_library.gni")
 
 chrome_proto_names = [ "chrome_trace_event.proto" ]
+minimal_chrome_proto_names = [ "chrome_trace_packet.proto" ]
 
 proto_library("lite") {
   generate_python = false
@@ -30,3 +31,15 @@
   proto_out_dir = "$perfetto_root_path/protos"
   generator_plugin_options = "wrapper_namespace=pbzero"
 }
+
+proto_library("minimal_complete_lite") {
+  generate_python = false
+  deps = [
+    ":lite",
+    "../:minimal_lite",
+    "../../config:config",
+  ]
+  sources = minimal_chrome_proto_names
+  proto_in_dir = "$perfetto_root_path/protos"
+  proto_out_dir = "$perfetto_root_path/protos"
+}
diff --git a/protos/perfetto/trace/chrome/chrome_trace_packet.proto b/protos/perfetto/trace/chrome/chrome_trace_packet.proto
new file mode 100644
index 0000000..76eab46
--- /dev/null
+++ b/protos/perfetto/trace/chrome/chrome_trace_packet.proto
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+// Use proto3 syntax as an optimization. The difference is that proto2 stores
+// unknown fields seen while decoding in an internal buffer (std::string) while
+// proto3 completely drops them. Since during validation we only need to check
+// for the presence of the trusted fields below, we can use proto3 as a way to
+// speed up this process.
+//
+// See https://developers.google.com/protocol-buffers/docs/proto3#unknowns and
+// https://android-review.googlesource.com/c/platform/external/perfetto/+/
+// 591673#17 for details.
+syntax = "proto3";
+option optimize_for = LITE_RUNTIME;
+
+import "perfetto/config/trace_config.proto";
+import "perfetto/trace/chrome/chrome_trace_event.proto";
+import "perfetto/trace/clock_snapshot.proto";
+import "perfetto/trace/trace_stats.proto";
+
+package perfetto.protos;
+
+// This proto contains only the TracePacket fields that Chrome needs.
+// Note that the field ids here must be kept in sync with TracePacket.
+// This protobuf is here to avoid bloating the Chrome binary with symbols
+// for all possible trace protos.
+// TODO(b/78898755): Try using weak bindings instead of a separate proto.
+message ChromeTracePacket {
+  ChromeEventBundle chrome_events = 5;
+
+  // The original trace config.
+  TraceConfig trace_config = 33;
+  TraceStats trace_stats = 35;
+
+  ClockSnapshot clock_snapshot = 6;
+}
diff --git a/src/tracing/BUILD.gn b/src/tracing/BUILD.gn
index 6b718a2..4415938 100644
--- a/src/tracing/BUILD.gn
+++ b/src/tracing/BUILD.gn
@@ -20,7 +20,7 @@
   public_deps = [
     "../../include/perfetto/tracing/core",
     "../../protos/perfetto/common",
-    "../../protos/perfetto/trace:minimal_lite",
+    "../../protos/perfetto/trace:trusted_lite",
     "../../protos/perfetto/trace:zero",
   ]
   deps = [