Merge "Trace Redaction - Stop using gen in production code" into main
diff --git a/Android.bp b/Android.bp
index 78939cf..ebc715d 100644
--- a/Android.bp
+++ b/Android.bp
@@ -15165,70 +15165,38 @@
         ":perfetto_include_perfetto_trace_processor_basic_types",
         ":perfetto_include_perfetto_trace_processor_storage",
         ":perfetto_include_perfetto_trace_processor_trace_processor",
-        ":perfetto_protos_perfetto_common_cpp_gen",
         ":perfetto_protos_perfetto_common_zero_gen",
-        ":perfetto_protos_perfetto_config_android_cpp_gen",
         ":perfetto_protos_perfetto_config_android_zero_gen",
-        ":perfetto_protos_perfetto_config_cpp_gen",
-        ":perfetto_protos_perfetto_config_ftrace_cpp_gen",
         ":perfetto_protos_perfetto_config_ftrace_zero_gen",
-        ":perfetto_protos_perfetto_config_gpu_cpp_gen",
         ":perfetto_protos_perfetto_config_gpu_zero_gen",
-        ":perfetto_protos_perfetto_config_inode_file_cpp_gen",
         ":perfetto_protos_perfetto_config_inode_file_zero_gen",
-        ":perfetto_protos_perfetto_config_interceptors_cpp_gen",
         ":perfetto_protos_perfetto_config_interceptors_zero_gen",
-        ":perfetto_protos_perfetto_config_power_cpp_gen",
         ":perfetto_protos_perfetto_config_power_zero_gen",
-        ":perfetto_protos_perfetto_config_process_stats_cpp_gen",
         ":perfetto_protos_perfetto_config_process_stats_zero_gen",
-        ":perfetto_protos_perfetto_config_profiling_cpp_gen",
         ":perfetto_protos_perfetto_config_profiling_zero_gen",
-        ":perfetto_protos_perfetto_config_statsd_cpp_gen",
         ":perfetto_protos_perfetto_config_statsd_zero_gen",
-        ":perfetto_protos_perfetto_config_sys_stats_cpp_gen",
         ":perfetto_protos_perfetto_config_sys_stats_zero_gen",
-        ":perfetto_protos_perfetto_config_system_info_cpp_gen",
         ":perfetto_protos_perfetto_config_system_info_zero_gen",
-        ":perfetto_protos_perfetto_config_track_event_cpp_gen",
         ":perfetto_protos_perfetto_config_track_event_zero_gen",
         ":perfetto_protos_perfetto_config_zero_gen",
-        ":perfetto_protos_perfetto_trace_android_cpp_gen",
         ":perfetto_protos_perfetto_trace_android_zero_gen",
-        ":perfetto_protos_perfetto_trace_chrome_cpp_gen",
         ":perfetto_protos_perfetto_trace_chrome_zero_gen",
-        ":perfetto_protos_perfetto_trace_etw_cpp_gen",
         ":perfetto_protos_perfetto_trace_etw_zero_gen",
-        ":perfetto_protos_perfetto_trace_filesystem_cpp_gen",
         ":perfetto_protos_perfetto_trace_filesystem_zero_gen",
-        ":perfetto_protos_perfetto_trace_ftrace_cpp_gen",
         ":perfetto_protos_perfetto_trace_ftrace_zero_gen",
-        ":perfetto_protos_perfetto_trace_gpu_cpp_gen",
         ":perfetto_protos_perfetto_trace_gpu_zero_gen",
-        ":perfetto_protos_perfetto_trace_interned_data_cpp_gen",
         ":perfetto_protos_perfetto_trace_interned_data_zero_gen",
-        ":perfetto_protos_perfetto_trace_minimal_cpp_gen",
         ":perfetto_protos_perfetto_trace_minimal_zero_gen",
-        ":perfetto_protos_perfetto_trace_non_minimal_cpp_gen",
         ":perfetto_protos_perfetto_trace_non_minimal_zero_gen",
-        ":perfetto_protos_perfetto_trace_perfetto_cpp_gen",
         ":perfetto_protos_perfetto_trace_perfetto_zero_gen",
-        ":perfetto_protos_perfetto_trace_power_cpp_gen",
         ":perfetto_protos_perfetto_trace_power_zero_gen",
         ":perfetto_protos_perfetto_trace_processor_zero_gen",
-        ":perfetto_protos_perfetto_trace_profiling_cpp_gen",
         ":perfetto_protos_perfetto_trace_profiling_zero_gen",
-        ":perfetto_protos_perfetto_trace_ps_cpp_gen",
         ":perfetto_protos_perfetto_trace_ps_zero_gen",
-        ":perfetto_protos_perfetto_trace_statsd_cpp_gen",
         ":perfetto_protos_perfetto_trace_statsd_zero_gen",
-        ":perfetto_protos_perfetto_trace_sys_stats_cpp_gen",
         ":perfetto_protos_perfetto_trace_sys_stats_zero_gen",
-        ":perfetto_protos_perfetto_trace_system_info_cpp_gen",
         ":perfetto_protos_perfetto_trace_system_info_zero_gen",
-        ":perfetto_protos_perfetto_trace_track_event_cpp_gen",
         ":perfetto_protos_perfetto_trace_track_event_zero_gen",
-        ":perfetto_protos_perfetto_trace_translation_cpp_gen",
         ":perfetto_protos_perfetto_trace_translation_zero_gen",
         ":perfetto_src_base_base",
         ":perfetto_src_protozero_protozero",
@@ -15271,70 +15239,38 @@
         "libz",
     ],
     generated_headers: [
-        "perfetto_protos_perfetto_common_cpp_gen_headers",
         "perfetto_protos_perfetto_common_zero_gen_headers",
-        "perfetto_protos_perfetto_config_android_cpp_gen_headers",
         "perfetto_protos_perfetto_config_android_zero_gen_headers",
-        "perfetto_protos_perfetto_config_cpp_gen_headers",
-        "perfetto_protos_perfetto_config_ftrace_cpp_gen_headers",
         "perfetto_protos_perfetto_config_ftrace_zero_gen_headers",
-        "perfetto_protos_perfetto_config_gpu_cpp_gen_headers",
         "perfetto_protos_perfetto_config_gpu_zero_gen_headers",
-        "perfetto_protos_perfetto_config_inode_file_cpp_gen_headers",
         "perfetto_protos_perfetto_config_inode_file_zero_gen_headers",
-        "perfetto_protos_perfetto_config_interceptors_cpp_gen_headers",
         "perfetto_protos_perfetto_config_interceptors_zero_gen_headers",
-        "perfetto_protos_perfetto_config_power_cpp_gen_headers",
         "perfetto_protos_perfetto_config_power_zero_gen_headers",
-        "perfetto_protos_perfetto_config_process_stats_cpp_gen_headers",
         "perfetto_protos_perfetto_config_process_stats_zero_gen_headers",
-        "perfetto_protos_perfetto_config_profiling_cpp_gen_headers",
         "perfetto_protos_perfetto_config_profiling_zero_gen_headers",
-        "perfetto_protos_perfetto_config_statsd_cpp_gen_headers",
         "perfetto_protos_perfetto_config_statsd_zero_gen_headers",
-        "perfetto_protos_perfetto_config_sys_stats_cpp_gen_headers",
         "perfetto_protos_perfetto_config_sys_stats_zero_gen_headers",
-        "perfetto_protos_perfetto_config_system_info_cpp_gen_headers",
         "perfetto_protos_perfetto_config_system_info_zero_gen_headers",
-        "perfetto_protos_perfetto_config_track_event_cpp_gen_headers",
         "perfetto_protos_perfetto_config_track_event_zero_gen_headers",
         "perfetto_protos_perfetto_config_zero_gen_headers",
-        "perfetto_protos_perfetto_trace_android_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_android_zero_gen_headers",
-        "perfetto_protos_perfetto_trace_chrome_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_chrome_zero_gen_headers",
-        "perfetto_protos_perfetto_trace_etw_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_etw_zero_gen_headers",
-        "perfetto_protos_perfetto_trace_filesystem_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_filesystem_zero_gen_headers",
-        "perfetto_protos_perfetto_trace_ftrace_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_ftrace_zero_gen_headers",
-        "perfetto_protos_perfetto_trace_gpu_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_gpu_zero_gen_headers",
-        "perfetto_protos_perfetto_trace_interned_data_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_interned_data_zero_gen_headers",
-        "perfetto_protos_perfetto_trace_minimal_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_minimal_zero_gen_headers",
-        "perfetto_protos_perfetto_trace_non_minimal_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_non_minimal_zero_gen_headers",
-        "perfetto_protos_perfetto_trace_perfetto_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_perfetto_zero_gen_headers",
-        "perfetto_protos_perfetto_trace_power_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_power_zero_gen_headers",
         "perfetto_protos_perfetto_trace_processor_zero_gen_headers",
-        "perfetto_protos_perfetto_trace_profiling_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_profiling_zero_gen_headers",
-        "perfetto_protos_perfetto_trace_ps_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_ps_zero_gen_headers",
-        "perfetto_protos_perfetto_trace_statsd_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_statsd_zero_gen_headers",
-        "perfetto_protos_perfetto_trace_sys_stats_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_sys_stats_zero_gen_headers",
-        "perfetto_protos_perfetto_trace_system_info_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_system_info_zero_gen_headers",
-        "perfetto_protos_perfetto_trace_track_event_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_track_event_zero_gen_headers",
-        "perfetto_protos_perfetto_trace_translation_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_translation_zero_gen_headers",
         "perfetto_src_trace_processor_importers_proto_gen_cc_chrome_track_event_descriptor",
         "perfetto_src_trace_processor_importers_proto_gen_cc_track_event_descriptor",
diff --git a/src/trace_redaction/BUILD.gn b/src/trace_redaction/BUILD.gn
index fe67ac8..2420b71 100644
--- a/src/trace_redaction/BUILD.gn
+++ b/src/trace_redaction/BUILD.gn
@@ -61,9 +61,7 @@
     "../../include/perfetto/ext/base",
     "../../include/perfetto/protozero:protozero",
     "../../include/perfetto/trace_processor:storage",
-    "../../protos/perfetto/trace:non_minimal_cpp",
     "../../protos/perfetto/trace:non_minimal_zero",
-    "../../protos/perfetto/trace/android:cpp",
     "../../protos/perfetto/trace/android:zero",
     "../../protos/perfetto/trace/ftrace:zero",
     "../../protos/perfetto/trace/ps:zero",
diff --git a/src/trace_redaction/prune_package_list.cc b/src/trace_redaction/prune_package_list.cc
index a85a18f..de6331b 100644
--- a/src/trace_redaction/prune_package_list.cc
+++ b/src/trace_redaction/prune_package_list.cc
@@ -18,15 +18,29 @@
 
 #include <string>
 
+#include "perfetto/base/logging.h"
 #include "perfetto/base/status.h"
 
-#include "protos/perfetto/trace/android/packages_list.gen.h"
-#include "protos/perfetto/trace/trace_packet.gen.h"
+#include "perfetto/protozero/scattered_heap_buffer.h"
+#include "protos/perfetto/trace/android/packages_list.pbzero.h"
+#include "src/trace_redaction/proto_util.h"
 
 namespace perfetto::trace_redaction {
+namespace {
 
-PrunePackageList::PrunePackageList() = default;
-PrunePackageList::~PrunePackageList() = default;
+bool ShouldKeepPackageInfo(protozero::Field package_info, uint64_t uid) {
+  PERFETTO_DCHECK(package_info.id() ==
+                  protos::pbzero::PackagesList::kPackagesFieldNumber);
+
+  protozero::ProtoDecoder decoder(package_info.as_bytes());
+  auto uid_field = decoder.FindField(
+      protos::pbzero::PackagesList::PackageInfo::kUidFieldNumber);
+
+  return uid_field.valid() &&
+         NormalizeUid(uid_field.as_uint64()) == NormalizeUid(uid);
+}
+
+}  // namespace
 
 base::Status PrunePackageList::Transform(const Context& context,
                                          std::string* packet) const {
@@ -34,30 +48,47 @@
     return base::ErrStatus("PrunePackageList: missing package uid.");
   }
 
+  protozero::ProtoDecoder packet_decoder(*packet);
+
   protos::pbzero::TracePacket::Decoder trace_packet_decoder(*packet);
 
-  if (!trace_packet_decoder.has_packages_list()) {
+  auto package_list = packet_decoder.FindField(
+      protos::pbzero::TracePacket::kPackagesListFieldNumber);
+
+  if (!package_list.valid()) {
     return base::OkStatus();
   }
 
-  auto normalized_uid = NormalizeUid(context.package_uid.value());
+  auto uid = context.package_uid.value();
 
-  protos::gen::TracePacket mutable_packet;
-  mutable_packet.ParseFromString(*packet);
+  protozero::HeapBuffered<protos::pbzero::TracePacket> packet_message;
 
-  auto* packages = mutable_packet.mutable_packages_list()->mutable_packages();
+  for (auto packet_field = packet_decoder.ReadField(); packet_field.valid();
+       packet_field = packet_decoder.ReadField()) {
+    if (packet_field.id() !=
+        protos::pbzero::TracePacket::kPackagesListFieldNumber) {
+      proto_util::AppendField(packet_field, packet_message.get());
+      continue;
+    }
 
-  // Remove all entries that don't match the uid. After this, one or more
-  // packages will be left in the list (multiple packages can share a uid).
-  packages->erase(
-      std::remove_if(
-          packages->begin(), packages->end(),
-          [normalized_uid](const protos::gen::PackagesList::PackageInfo& info) {
-            return NormalizeUid(info.uid()) != normalized_uid;
-          }),
-      packages->end());
+    auto* package_list_message = packet_message->set_packages_list();
 
-  packet->assign(mutable_packet.SerializeAsString());
+    protozero::ProtoDecoder package_list_decoder(packet_field.as_bytes());
+
+    for (auto package_field = package_list_decoder.ReadField();
+         package_field.valid();
+         package_field = package_list_decoder.ReadField()) {
+      // If not packages, keep.
+      // If packages and uid matches, keep.
+      if (package_field.id() !=
+              protos::pbzero::PackagesList::kPackagesFieldNumber ||
+          ShouldKeepPackageInfo(package_field, uid)) {
+        proto_util::AppendField(package_field, package_list_message);
+      }
+    }
+  }
+
+  packet->assign(packet_message.SerializeAsString());
 
   return base::OkStatus();
 }
diff --git a/src/trace_redaction/prune_package_list.h b/src/trace_redaction/prune_package_list.h
index 24d9ec2..ff5f060 100644
--- a/src/trace_redaction/prune_package_list.h
+++ b/src/trace_redaction/prune_package_list.h
@@ -28,9 +28,6 @@
 // Returns `base::ErrStatus()` if `Context.package_uid` was not set.
 class PrunePackageList final : public TransformPrimitive {
  public:
-  PrunePackageList();
-  ~PrunePackageList() override;
-
   base::Status Transform(const Context& context,
                          std::string* packet) const override;
 };