diff --git a/BUILD.gn b/BUILD.gn
index bfadecaa5c..1e61d67e04 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -48,6 +48,10 @@ if (enable_perfetto_trace_processor && enable_perfetto_trace_processor_sqlite) {
all_targets += [ "src/trace_processor:trace_processor_shell" ]
}
+if (enable_perfetto_trace_processor) {
+ all_targets += [ "src/trace_redaction:trace_redactor" ]
+}
+
if (enable_perfetto_traceconv) {
all_targets += [ "src/traceconv" ]
if (is_cross_compiling) {
diff --git a/src/trace_redaction/BUILD.gn b/src/trace_redaction/BUILD.gn
index cff9588bf3..f65c588bee 100644
--- a/src/trace_redaction/BUILD.gn
+++ b/src/trace_redaction/BUILD.gn
@@ -14,6 +14,18 @@
import("../../gn/test.gni")
+# The main entry point for external processes. This is separate from
+# "trace_redaction" because tests also depend on "trace_redaction".
+executable("trace_redactor") {
+ sources = [ "main.cc" ]
+ deps = [
+ ":trace_redaction",
+ "../../gn:default_deps",
+ "../../include/perfetto/base",
+ "../../include/perfetto/ext/base",
+ ]
+}
+
source_set("trace_redaction") {
sources = [
"find_package_uid.cc",
diff --git a/src/trace_redaction/main.cc b/src/trace_redaction/main.cc
new file mode 100644
index 0000000000..24ad116d96
--- /dev/null
+++ b/src/trace_redaction/main.cc
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2024 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 "perfetto/base/logging.h"
+#include "perfetto/base/status.h"
+#include "src/trace_redaction/find_package_uid.h"
+#include "src/trace_redaction/prune_package_list.h"
+#include "src/trace_redaction/trace_redaction_framework.h"
+#include "src/trace_redaction/trace_redactor.h"
+
+namespace perfetto::trace_redaction {
+
+// Builds and runs a trace redactor.
+static base::Status Main(std::string_view input,
+ std::string_view output,
+ std::string_view package_name) {
+ TraceRedactor redactor;
+
+ // Add all collectors.
+ redactor.collectors()->emplace_back(new FindPackageUid());
+
+ // TODO(vaage): Add all builders.
+
+ // Add all transforms.
+ redactor.transformers()->emplace_back(new PrunePackageList());
+
+ Context context;
+ context.package_name = package_name;
+
+ return redactor.Redact(input, output, &context);
+}
+
+} // namespace perfetto::trace_redaction
+
+int main(int argc, char** argv) {
+ constexpr int kSuccess = 0;
+ constexpr int kFailure = 1;
+ constexpr int kInvalidArgs = 2;
+
+ if (argc != 4) {
+ PERFETTO_ELOG(
+ "Invalid arguments: %s