Snap for 9549188 from cc7aef8488eeee5f8effe4846332c46e5d3b7de2 to mainline-uwb-release
Change-Id: I66292a090a51432d5fef772b8986ab3a6503b236
diff --git a/Android.bp b/Android.bp
index 5373c69..b238396 100644
--- a/Android.bp
+++ b/Android.bp
@@ -862,8 +862,9 @@
"//apex_available:platform",
"com.android.art",
"com.android.art.debug",
+ "com.android.tethering",
],
- min_sdk_version: "S",
+ min_sdk_version: "30",
}
// GN: //src/perfetto_cmd:perfetto
@@ -2239,6 +2240,7 @@
srcs: [
"protos/perfetto/config/android/android_log_config.proto",
"protos/perfetto/config/android/android_polled_state_config.proto",
+ "protos/perfetto/config/android/network_trace_config.proto",
"protos/perfetto/config/android/packages_list_config.proto",
],
tools: [
@@ -2249,6 +2251,7 @@
out: [
"external/perfetto/protos/perfetto/config/android/android_log_config.gen.cc",
"external/perfetto/protos/perfetto/config/android/android_polled_state_config.gen.cc",
+ "external/perfetto/protos/perfetto/config/android/network_trace_config.gen.cc",
"external/perfetto/protos/perfetto/config/android/packages_list_config.gen.cc",
],
}
@@ -2259,6 +2262,7 @@
srcs: [
"protos/perfetto/config/android/android_log_config.proto",
"protos/perfetto/config/android/android_polled_state_config.proto",
+ "protos/perfetto/config/android/network_trace_config.proto",
"protos/perfetto/config/android/packages_list_config.proto",
],
tools: [
@@ -2269,6 +2273,7 @@
out: [
"external/perfetto/protos/perfetto/config/android/android_log_config.gen.h",
"external/perfetto/protos/perfetto/config/android/android_polled_state_config.gen.h",
+ "external/perfetto/protos/perfetto/config/android/network_trace_config.gen.h",
"external/perfetto/protos/perfetto/config/android/packages_list_config.gen.h",
],
export_include_dirs: [
@@ -2283,6 +2288,7 @@
srcs: [
"protos/perfetto/config/android/android_log_config.proto",
"protos/perfetto/config/android/android_polled_state_config.proto",
+ "protos/perfetto/config/android/network_trace_config.proto",
"protos/perfetto/config/android/packages_list_config.proto",
],
tools: [
@@ -2292,6 +2298,7 @@
out: [
"external/perfetto/protos/perfetto/config/android/android_log_config.pb.cc",
"external/perfetto/protos/perfetto/config/android/android_polled_state_config.pb.cc",
+ "external/perfetto/protos/perfetto/config/android/network_trace_config.pb.cc",
"external/perfetto/protos/perfetto/config/android/packages_list_config.pb.cc",
],
}
@@ -2302,6 +2309,7 @@
srcs: [
"protos/perfetto/config/android/android_log_config.proto",
"protos/perfetto/config/android/android_polled_state_config.proto",
+ "protos/perfetto/config/android/network_trace_config.proto",
"protos/perfetto/config/android/packages_list_config.proto",
],
tools: [
@@ -2311,6 +2319,7 @@
out: [
"external/perfetto/protos/perfetto/config/android/android_log_config.pb.h",
"external/perfetto/protos/perfetto/config/android/android_polled_state_config.pb.h",
+ "external/perfetto/protos/perfetto/config/android/network_trace_config.pb.h",
"external/perfetto/protos/perfetto/config/android/packages_list_config.pb.h",
],
export_include_dirs: [
@@ -2325,6 +2334,7 @@
srcs: [
"protos/perfetto/config/android/android_log_config.proto",
"protos/perfetto/config/android/android_polled_state_config.proto",
+ "protos/perfetto/config/android/network_trace_config.proto",
"protos/perfetto/config/android/packages_list_config.proto",
],
tools: [
@@ -2335,6 +2345,7 @@
out: [
"external/perfetto/protos/perfetto/config/android/android_log_config.pbzero.cc",
"external/perfetto/protos/perfetto/config/android/android_polled_state_config.pbzero.cc",
+ "external/perfetto/protos/perfetto/config/android/network_trace_config.pbzero.cc",
"external/perfetto/protos/perfetto/config/android/packages_list_config.pbzero.cc",
],
}
@@ -2345,6 +2356,7 @@
srcs: [
"protos/perfetto/config/android/android_log_config.proto",
"protos/perfetto/config/android/android_polled_state_config.proto",
+ "protos/perfetto/config/android/network_trace_config.proto",
"protos/perfetto/config/android/packages_list_config.proto",
],
tools: [
@@ -2355,6 +2367,7 @@
out: [
"external/perfetto/protos/perfetto/config/android/android_log_config.pbzero.h",
"external/perfetto/protos/perfetto/config/android/android_polled_state_config.pbzero.h",
+ "external/perfetto/protos/perfetto/config/android/network_trace_config.pbzero.h",
"external/perfetto/protos/perfetto/config/android/packages_list_config.pbzero.h",
],
export_include_dirs: [
@@ -2441,6 +2454,7 @@
"protos/perfetto/common/track_event_descriptor.proto",
"protos/perfetto/config/android/android_log_config.proto",
"protos/perfetto/config/android/android_polled_state_config.proto",
+ "protos/perfetto/config/android/network_trace_config.proto",
"protos/perfetto/config/android/packages_list_config.proto",
"protos/perfetto/config/chrome/chrome_config.proto",
"protos/perfetto/config/data_source_config.proto",
@@ -3817,6 +3831,7 @@
"protos/perfetto/trace/android/gpu_mem_event.proto",
"protos/perfetto/trace/android/graphics_frame_event.proto",
"protos/perfetto/trace/android/initial_display_state.proto",
+ "protos/perfetto/trace/android/network_trace.proto",
"protos/perfetto/trace/android/packages_list.proto",
],
tools: [
@@ -3831,6 +3846,7 @@
"external/perfetto/protos/perfetto/trace/android/gpu_mem_event.gen.cc",
"external/perfetto/protos/perfetto/trace/android/graphics_frame_event.gen.cc",
"external/perfetto/protos/perfetto/trace/android/initial_display_state.gen.cc",
+ "external/perfetto/protos/perfetto/trace/android/network_trace.gen.cc",
"external/perfetto/protos/perfetto/trace/android/packages_list.gen.cc",
],
}
@@ -3845,6 +3861,7 @@
"protos/perfetto/trace/android/gpu_mem_event.proto",
"protos/perfetto/trace/android/graphics_frame_event.proto",
"protos/perfetto/trace/android/initial_display_state.proto",
+ "protos/perfetto/trace/android/network_trace.proto",
"protos/perfetto/trace/android/packages_list.proto",
],
tools: [
@@ -3859,6 +3876,7 @@
"external/perfetto/protos/perfetto/trace/android/gpu_mem_event.gen.h",
"external/perfetto/protos/perfetto/trace/android/graphics_frame_event.gen.h",
"external/perfetto/protos/perfetto/trace/android/initial_display_state.gen.h",
+ "external/perfetto/protos/perfetto/trace/android/network_trace.gen.h",
"external/perfetto/protos/perfetto/trace/android/packages_list.gen.h",
],
export_include_dirs: [
@@ -3877,6 +3895,7 @@
"protos/perfetto/trace/android/gpu_mem_event.proto",
"protos/perfetto/trace/android/graphics_frame_event.proto",
"protos/perfetto/trace/android/initial_display_state.proto",
+ "protos/perfetto/trace/android/network_trace.proto",
"protos/perfetto/trace/android/packages_list.proto",
],
tools: [
@@ -3890,6 +3909,7 @@
"external/perfetto/protos/perfetto/trace/android/gpu_mem_event.pb.cc",
"external/perfetto/protos/perfetto/trace/android/graphics_frame_event.pb.cc",
"external/perfetto/protos/perfetto/trace/android/initial_display_state.pb.cc",
+ "external/perfetto/protos/perfetto/trace/android/network_trace.pb.cc",
"external/perfetto/protos/perfetto/trace/android/packages_list.pb.cc",
],
}
@@ -3904,6 +3924,7 @@
"protos/perfetto/trace/android/gpu_mem_event.proto",
"protos/perfetto/trace/android/graphics_frame_event.proto",
"protos/perfetto/trace/android/initial_display_state.proto",
+ "protos/perfetto/trace/android/network_trace.proto",
"protos/perfetto/trace/android/packages_list.proto",
],
tools: [
@@ -3917,6 +3938,7 @@
"external/perfetto/protos/perfetto/trace/android/gpu_mem_event.pb.h",
"external/perfetto/protos/perfetto/trace/android/graphics_frame_event.pb.h",
"external/perfetto/protos/perfetto/trace/android/initial_display_state.pb.h",
+ "external/perfetto/protos/perfetto/trace/android/network_trace.pb.h",
"external/perfetto/protos/perfetto/trace/android/packages_list.pb.h",
],
export_include_dirs: [
@@ -3935,6 +3957,7 @@
"protos/perfetto/trace/android/gpu_mem_event.proto",
"protos/perfetto/trace/android/graphics_frame_event.proto",
"protos/perfetto/trace/android/initial_display_state.proto",
+ "protos/perfetto/trace/android/network_trace.proto",
"protos/perfetto/trace/android/packages_list.proto",
],
tools: [
@@ -3949,6 +3972,7 @@
"external/perfetto/protos/perfetto/trace/android/gpu_mem_event.pbzero.cc",
"external/perfetto/protos/perfetto/trace/android/graphics_frame_event.pbzero.cc",
"external/perfetto/protos/perfetto/trace/android/initial_display_state.pbzero.cc",
+ "external/perfetto/protos/perfetto/trace/android/network_trace.pbzero.cc",
"external/perfetto/protos/perfetto/trace/android/packages_list.pbzero.cc",
],
}
@@ -3963,6 +3987,7 @@
"protos/perfetto/trace/android/gpu_mem_event.proto",
"protos/perfetto/trace/android/graphics_frame_event.proto",
"protos/perfetto/trace/android/initial_display_state.proto",
+ "protos/perfetto/trace/android/network_trace.proto",
"protos/perfetto/trace/android/packages_list.proto",
],
tools: [
@@ -3977,6 +4002,7 @@
"external/perfetto/protos/perfetto/trace/android/gpu_mem_event.pbzero.h",
"external/perfetto/protos/perfetto/trace/android/graphics_frame_event.pbzero.h",
"external/perfetto/protos/perfetto/trace/android/initial_display_state.pbzero.h",
+ "external/perfetto/protos/perfetto/trace/android/network_trace.pbzero.h",
"external/perfetto/protos/perfetto/trace/android/packages_list.pbzero.h",
],
export_include_dirs: [
@@ -4137,6 +4163,7 @@
"protos/perfetto/common/track_event_descriptor.proto",
"protos/perfetto/config/android/android_log_config.proto",
"protos/perfetto/config/android/android_polled_state_config.proto",
+ "protos/perfetto/config/android/network_trace_config.proto",
"protos/perfetto/config/android/packages_list_config.proto",
"protos/perfetto/config/chrome/chrome_config.proto",
"protos/perfetto/config/data_source_config.proto",
@@ -4162,6 +4189,7 @@
"protos/perfetto/trace/android/gpu_mem_event.proto",
"protos/perfetto/trace/android/graphics_frame_event.proto",
"protos/perfetto/trace/android/initial_display_state.proto",
+ "protos/perfetto/trace/android/network_trace.proto",
"protos/perfetto/trace/android/packages_list.proto",
"protos/perfetto/trace/chrome/chrome_benchmark_metadata.proto",
"protos/perfetto/trace/chrome/chrome_metadata.proto",
@@ -9507,6 +9535,7 @@
"protos/perfetto/common/track_event_descriptor.proto",
"protos/perfetto/config/android/android_log_config.proto",
"protos/perfetto/config/android/android_polled_state_config.proto",
+ "protos/perfetto/config/android/network_trace_config.proto",
"protos/perfetto/config/android/packages_list_config.proto",
"protos/perfetto/config/chrome/chrome_config.proto",
"protos/perfetto/config/data_source_config.proto",
@@ -9532,6 +9561,7 @@
"protos/perfetto/trace/android/gpu_mem_event.proto",
"protos/perfetto/trace/android/graphics_frame_event.proto",
"protos/perfetto/trace/android/initial_display_state.proto",
+ "protos/perfetto/trace/android/network_trace.proto",
"protos/perfetto/trace/android/packages_list.proto",
"protos/perfetto/trace/chrome/chrome_benchmark_metadata.proto",
"protos/perfetto/trace/chrome/chrome_metadata.proto",
diff --git a/BUILD b/BUILD
index 8fa7874..76401ad 100644
--- a/BUILD
+++ b/BUILD
@@ -2332,6 +2332,7 @@
srcs = [
"protos/perfetto/config/android/android_log_config.proto",
"protos/perfetto/config/android/android_polled_state_config.proto",
+ "protos/perfetto/config/android/network_trace_config.proto",
"protos/perfetto/config/android/packages_list_config.proto",
],
visibility = [
@@ -2912,6 +2913,7 @@
"protos/perfetto/trace/android/gpu_mem_event.proto",
"protos/perfetto/trace/android/graphics_frame_event.proto",
"protos/perfetto/trace/android/initial_display_state.proto",
+ "protos/perfetto/trace/android/network_trace.proto",
"protos/perfetto/trace/android/packages_list.proto",
],
visibility = [
diff --git a/CHANGELOG b/CHANGELOG
index 99e6c4b..4b35e38 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -8,8 +8,8 @@
UI:
*
SDK:
- *
-
+ * Added TracingInitArgs::enable_system_consumer configuration option, that
+ allows the linker to discard the consumer IPC, if not required.
v25.0 - 2022-04-01:
Tracing service and probes:
diff --git a/include/perfetto/tracing/internal/system_tracing_backend.h b/include/perfetto/tracing/internal/system_tracing_backend.h
index 69a1cad..7617109 100644
--- a/include/perfetto/tracing/internal/system_tracing_backend.h
+++ b/include/perfetto/tracing/internal/system_tracing_backend.h
@@ -35,6 +35,8 @@
// together with system traces, useful to correlate on the timeline system
// events (e.g. scheduling slices from the kernel) with in-app events.
namespace internal {
+
+// Full backend (with producer and consumer)
class PERFETTO_EXPORT SystemTracingBackend : public TracingBackend {
public:
static TracingBackend* GetInstance();
@@ -49,6 +51,21 @@
SystemTracingBackend();
};
+// Producer only backend.
+class PERFETTO_EXPORT SystemTracingProducerOnlyBackend : public TracingBackend {
+ public:
+ static TracingBackend* GetInstance();
+
+ // TracingBackend implementation.
+ std::unique_ptr<ProducerEndpoint> ConnectProducer(
+ const ConnectProducerArgs&) override;
+ std::unique_ptr<ConsumerEndpoint> ConnectConsumer(
+ const ConnectConsumerArgs&) override;
+
+ private:
+ SystemTracingProducerOnlyBackend();
+};
+
} // namespace internal
} // namespace perfetto
diff --git a/include/perfetto/tracing/tracing.h b/include/perfetto/tracing/tracing.h
index 9aae9e8..01d4851 100644
--- a/include/perfetto/tracing/tracing.h
+++ b/include/perfetto/tracing/tracing.h
@@ -115,6 +115,13 @@
// callback instead of being logged directly.
LogMessageCallback log_message_callback = nullptr;
+ // This flag can be set to false in order to avoid enabling the system
+ // consumer in Tracing::Initialize(), so that the linker can remove the unused
+ // consumer IPC implementation to reduce binary size. When this option is
+ // false, calling Tracing::NewTrace() on the system backend will fail. This
+ // setting only has an effect if kSystemBackend is specified in |backends|.
+ bool enable_system_consumer = true;
+
protected:
friend class Tracing;
friend class internal::TracingMuxerImpl;
@@ -124,11 +131,13 @@
bool operator==(const TracingInitArgs& other) const {
return std::tie(backends, custom_backend, platform, shmem_size_hint_kb,
shmem_page_size_hint_kb, in_process_backend_factory_,
- system_backend_factory_, dcheck_is_on_) ==
+ system_backend_factory_, dcheck_is_on_,
+ enable_system_consumer) ==
std::tie(other.backends, other.custom_backend, other.platform,
other.shmem_size_hint_kb, other.shmem_page_size_hint_kb,
other.in_process_backend_factory_,
- other.system_backend_factory_, other.dcheck_is_on_);
+ other.system_backend_factory_, other.dcheck_is_on_,
+ other.enable_system_consumer);
}
using BackendFactoryFunction = TracingBackend* (*)();
@@ -161,8 +170,13 @@
&internal::InProcessTracingBackend::GetInstance;
}
if (args.backends & kSystemBackend) {
- args_copy.system_backend_factory_ =
- &internal::SystemTracingBackend::GetInstance;
+ if (args.enable_system_consumer) {
+ args_copy.system_backend_factory_ =
+ &internal::SystemTracingBackend::GetInstance;
+ } else {
+ args_copy.system_backend_factory_ =
+ &internal::SystemTracingProducerOnlyBackend::GetInstance;
+ }
}
InitializeInternal(args_copy);
}
@@ -172,8 +186,6 @@
// Start a new tracing session using the given tracing backend. Use
// |kUnspecifiedBackend| to select an available backend automatically.
- // For the moment this can be used only when initializing tracing in
- // kInProcess mode. For the system mode use the 'bin/perfetto' cmdline client.
static std::unique_ptr<TracingSession> NewTrace(
BackendType = kUnspecifiedBackend);
diff --git a/protos/perfetto/config/android/BUILD.gn b/protos/perfetto/config/android/BUILD.gn
index e7180d5..7377969 100644
--- a/protos/perfetto/config/android/BUILD.gn
+++ b/protos/perfetto/config/android/BUILD.gn
@@ -20,6 +20,7 @@
sources = [
"android_log_config.proto",
"android_polled_state_config.proto",
+ "network_trace_config.proto",
"packages_list_config.proto",
]
}
diff --git a/protos/perfetto/config/android/network_trace_config.proto b/protos/perfetto/config/android/network_trace_config.proto
new file mode 100644
index 0000000..f58f280
--- /dev/null
+++ b/protos/perfetto/config/android/network_trace_config.proto
@@ -0,0 +1,30 @@
+/*
+ * 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;
+
+// Network tracing data source that records details on all packets sent or
+// received by the network.
+message NetworkPacketTraceConfig {
+ // Polling frequency in milliseconds. Network tracing writes to a fixed size
+ // ring buffer. The polling interval should be such that the ring buffer is
+ // unlikely to fill in that interval (or that filling is an acceptable risk).
+ // The minimum polling rate is 100ms (values below this are ignored).
+ // Introduced in Android 14 (U).
+ optional uint32 poll_ms = 1;
+}
diff --git a/protos/perfetto/config/data_source_config.proto b/protos/perfetto/config/data_source_config.proto
index 22b18e3..7e5ded3 100644
--- a/protos/perfetto/config/data_source_config.proto
+++ b/protos/perfetto/config/data_source_config.proto
@@ -20,6 +20,7 @@
import "protos/perfetto/config/android/android_log_config.proto";
import "protos/perfetto/config/android/android_polled_state_config.proto";
+import "protos/perfetto/config/android/network_trace_config.proto";
import "protos/perfetto/config/android/packages_list_config.proto";
import "protos/perfetto/config/chrome/chrome_config.proto";
import "protos/perfetto/config/ftrace/ftrace_config.proto";
@@ -37,7 +38,7 @@
import "protos/perfetto/config/track_event/track_event_config.proto";
// The configuration that is passed to each data source when starting tracing.
-// Next id: 116
+// Next id: 121
message DataSourceConfig {
enum SessionInitiator {
SESSION_INITIATOR_UNSPECIFIED = 0;
@@ -141,6 +142,11 @@
// traced_probes) may not support interception.
optional InterceptorConfig interceptor_config = 115;
+ // Data source name: android.network_packets.
+ // Introduced in Android 14 (U).
+ optional NetworkPacketTraceConfig network_packet_trace_config = 120
+ [lazy = true];
+
// This is a fallback mechanism to send a free-form text config to the
// producer. In theory this should never be needed. All the code that
// is part of the platform (i.e. traced service) is supposed to *not* truncate
diff --git a/protos/perfetto/config/perfetto_config.proto b/protos/perfetto/config/perfetto_config.proto
index 5c354e8..b809855 100644
--- a/protos/perfetto/config/perfetto_config.proto
+++ b/protos/perfetto/config/perfetto_config.proto
@@ -391,6 +391,21 @@
// End of protos/perfetto/config/android/android_polled_state_config.proto
+// Begin of protos/perfetto/config/android/network_trace_config.proto
+
+// Network tracing data source that records details on all packets sent or
+// received by the network.
+message NetworkPacketTraceConfig {
+ // Polling frequency in milliseconds. Network tracing writes to a fixed size
+ // ring buffer. The polling interval should be such that the ring buffer is
+ // unlikely to fill in that interval (or that filling is an acceptable risk).
+ // The minimum polling rate is 100ms (values below this are ignored).
+ // Introduced in Android 14 (U).
+ optional uint32 poll_ms = 1;
+}
+
+// End of protos/perfetto/config/android/network_trace_config.proto
+
// Begin of protos/perfetto/config/android/packages_list_config.proto
// Data source that lists details (such as version code) about packages on an
@@ -1588,7 +1603,7 @@
// Begin of protos/perfetto/config/data_source_config.proto
// The configuration that is passed to each data source when starting tracing.
-// Next id: 116
+// Next id: 121
message DataSourceConfig {
enum SessionInitiator {
SESSION_INITIATOR_UNSPECIFIED = 0;
@@ -1692,6 +1707,11 @@
// traced_probes) may not support interception.
optional InterceptorConfig interceptor_config = 115;
+ // Data source name: android.network_packets.
+ // Introduced in Android 14 (U).
+ optional NetworkPacketTraceConfig network_packet_trace_config = 120
+ [lazy = true];
+
// This is a fallback mechanism to send a free-form text config to the
// producer. In theory this should never be needed. All the code that
// is part of the platform (i.e. traced service) is supposed to *not* truncate
diff --git a/protos/perfetto/trace/android/BUILD.gn b/protos/perfetto/trace/android/BUILD.gn
index 3643427..dbfed3c 100644
--- a/protos/perfetto/trace/android/BUILD.gn
+++ b/protos/perfetto/trace/android/BUILD.gn
@@ -24,6 +24,7 @@
"gpu_mem_event.proto",
"graphics_frame_event.proto",
"initial_display_state.proto",
+ "network_trace.proto",
"packages_list.proto",
]
}
diff --git a/protos/perfetto/trace/android/network_trace.proto b/protos/perfetto/trace/android/network_trace.proto
new file mode 100644
index 0000000..d1c43a2
--- /dev/null
+++ b/protos/perfetto/trace/android/network_trace.proto
@@ -0,0 +1,56 @@
+/*
+ * 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;
+
+enum TrafficDirection {
+ DIR_UNSPECIFIED = 0;
+ DIR_INGRESS = 1;
+ DIR_EGRESS = 2;
+}
+
+// NetworkPacketEvent records the details of a single packet sent or received
+// on the network (in Linux kernel terminology, one sk_buff struct).
+message NetworkPacketEvent {
+ // The direction traffic is flowing for this event.
+ optional TrafficDirection direction = 1;
+
+ // The name of the interface if available (e.g. 'rmnet0').
+ optional string interface = 2;
+
+ // The length of the packet in bytes (wire_size - L2_header_size).
+ optional uint32 length = 3;
+
+ // The Linux user id associated with the packet's socket.
+ optional uint32 uid = 4;
+
+ // The Android network tag associated with the packet's socket.
+ optional uint32 tag = 5;
+
+ // The packet's IP protocol (TCP=6, UDP=17, etc).
+ optional uint32 ip_proto = 6;
+
+ // The packet's TCP flags as a bitmask (FIN=0x1, SYN=0x2, RST=0x4, etc).
+ optional uint32 tcp_flags = 7;
+
+ // The local udp/tcp port of the packet.
+ optional uint32 local_port = 8;
+
+ // The remote udp/tcp port of the packet.
+ optional uint32 remote_port = 9;
+}
diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto
index 63b058f..8056c83 100644
--- a/protos/perfetto/trace/perfetto_trace.proto
+++ b/protos/perfetto/trace/perfetto_trace.proto
@@ -391,6 +391,21 @@
// End of protos/perfetto/config/android/android_polled_state_config.proto
+// Begin of protos/perfetto/config/android/network_trace_config.proto
+
+// Network tracing data source that records details on all packets sent or
+// received by the network.
+message NetworkPacketTraceConfig {
+ // Polling frequency in milliseconds. Network tracing writes to a fixed size
+ // ring buffer. The polling interval should be such that the ring buffer is
+ // unlikely to fill in that interval (or that filling is an acceptable risk).
+ // The minimum polling rate is 100ms (values below this are ignored).
+ // Introduced in Android 14 (U).
+ optional uint32 poll_ms = 1;
+}
+
+// End of protos/perfetto/config/android/network_trace_config.proto
+
// Begin of protos/perfetto/config/android/packages_list_config.proto
// Data source that lists details (such as version code) about packages on an
@@ -1588,7 +1603,7 @@
// Begin of protos/perfetto/config/data_source_config.proto
// The configuration that is passed to each data source when starting tracing.
-// Next id: 116
+// Next id: 121
message DataSourceConfig {
enum SessionInitiator {
SESSION_INITIATOR_UNSPECIFIED = 0;
@@ -1692,6 +1707,11 @@
// traced_probes) may not support interception.
optional InterceptorConfig interceptor_config = 115;
+ // Data source name: android.network_packets.
+ // Introduced in Android 14 (U).
+ optional NetworkPacketTraceConfig network_packet_trace_config = 120
+ [lazy = true];
+
// This is a fallback mechanism to send a free-form text config to the
// producer. In theory this should never be needed. All the code that
// is part of the platform (i.e. traced service) is supposed to *not* truncate
@@ -2801,6 +2821,47 @@
// End of protos/perfetto/trace/android/initial_display_state.proto
+// Begin of protos/perfetto/trace/android/network_trace.proto
+
+enum TrafficDirection {
+ DIR_UNSPECIFIED = 0;
+ DIR_INGRESS = 1;
+ DIR_EGRESS = 2;
+}
+
+// NetworkPacketEvent records the details of a single packet sent or received
+// on the network (in Linux kernel terminology, one sk_buff struct).
+message NetworkPacketEvent {
+ // The direction traffic is flowing for this event.
+ optional TrafficDirection direction = 1;
+
+ // The name of the interface if available (e.g. 'rmnet0').
+ optional string interface = 2;
+
+ // The length of the packet in bytes (wire_size - L2_header_size).
+ optional uint32 length = 3;
+
+ // The Linux user id associated with the packet's socket.
+ optional uint32 uid = 4;
+
+ // The Android network tag associated with the packet's socket.
+ optional uint32 tag = 5;
+
+ // The packet's IP protocol (TCP=6, UDP=17, etc).
+ optional uint32 ip_proto = 6;
+
+ // The packet's TCP flags as a bitmask (FIN=0x1, SYN=0x2, RST=0x4, etc).
+ optional uint32 tcp_flags = 7;
+
+ // The local udp/tcp port of the packet.
+ optional uint32 local_port = 8;
+
+ // The remote udp/tcp port of the packet.
+ optional uint32 remote_port = 9;
+}
+
+// End of protos/perfetto/trace/android/network_trace.proto
+
// Begin of protos/perfetto/trace/android/packages_list.proto
message PackagesList {
@@ -10073,7 +10134,7 @@
// See the [Buffers and Dataflow](/docs/concepts/buffers.md) doc for details.
//
// Next reserved id: 14 (up to 15).
-// Next id: 83.
+// Next id: 89.
message TracePacket {
// The timestamp of the TracePacket.
// By default this timestamps refers to the trace clock (CLOCK_BOOTTIME on
@@ -10174,6 +10235,9 @@
// even if the extension proto is not checked in the Perfetto repo.
ExtensionDescriptor extension_descriptor = 72;
+ // Represents a single packet sent or received by the network.
+ NetworkPacketEvent network_packet = 88;
+
// This field is only used for testing.
// In previous versions of this proto this field had the id 268435455
// This caused many problems:
diff --git a/protos/perfetto/trace/trace_packet.proto b/protos/perfetto/trace/trace_packet.proto
index b08ec4e..2eb602a 100644
--- a/protos/perfetto/trace/trace_packet.proto
+++ b/protos/perfetto/trace/trace_packet.proto
@@ -25,6 +25,7 @@
import "protos/perfetto/trace/android/gpu_mem_event.proto";
import "protos/perfetto/trace/android/graphics_frame_event.proto";
import "protos/perfetto/trace/android/initial_display_state.proto";
+import "protos/perfetto/trace/android/network_trace.proto";
import "protos/perfetto/trace/android/packages_list.proto";
import "protos/perfetto/trace/chrome/chrome_benchmark_metadata.proto";
import "protos/perfetto/trace/chrome/chrome_metadata.proto";
@@ -87,7 +88,7 @@
// See the [Buffers and Dataflow](/docs/concepts/buffers.md) doc for details.
//
// Next reserved id: 14 (up to 15).
-// Next id: 83.
+// Next id: 89.
message TracePacket {
// The timestamp of the TracePacket.
// By default this timestamps refers to the trace clock (CLOCK_BOOTTIME on
@@ -188,6 +189,9 @@
// even if the extension proto is not checked in the Perfetto repo.
ExtensionDescriptor extension_descriptor = 72;
+ // Represents a single packet sent or received by the network.
+ NetworkPacketEvent network_packet = 88;
+
// This field is only used for testing.
// In previous versions of this proto this field had the id 268435455
// This caused many problems:
diff --git a/src/protozero/proto_decoder.cc b/src/protozero/proto_decoder.cc
index a766a28..0595c1f 100644
--- a/src/protozero/proto_decoder.cc
+++ b/src/protozero/proto_decoder.cc
@@ -46,8 +46,8 @@
// Parses one field and returns the field itself and a pointer to the next
// field to parse. If parsing fails, the returned |next| == |buffer|.
-PERFETTO_ALWAYS_INLINE ParseFieldResult
-ParseOneField(const uint8_t* const buffer, const uint8_t* const end) {
+ParseFieldResult ParseOneField(const uint8_t* const buffer,
+ const uint8_t* const end) {
ParseFieldResult res{ParseFieldResult::kAbort, buffer, Field{}};
// The first byte of a proto field is structured as follows:
@@ -172,7 +172,6 @@
return res;
}
-PERFETTO_ALWAYS_INLINE
Field ProtoDecoder::ReadField() {
ParseFieldResult res;
do {
diff --git a/src/tracing/internal/system_tracing_backend.cc b/src/tracing/internal/system_tracing_backend.cc
index 5aa3493..5562421 100644
--- a/src/tracing/internal/system_tracing_backend.cc
+++ b/src/tracing/internal/system_tracing_backend.cc
@@ -25,17 +25,10 @@
namespace perfetto {
namespace internal {
+namespace {
-// static
-TracingBackend* SystemTracingBackend::GetInstance() {
- static auto* instance = new SystemTracingBackend();
- return instance;
-}
-
-SystemTracingBackend::SystemTracingBackend() {}
-
-std::unique_ptr<ProducerEndpoint> SystemTracingBackend::ConnectProducer(
- const ConnectProducerArgs& args) {
+std::unique_ptr<ProducerEndpoint> CreateProducerEndpoint(
+ const TracingBackend::ConnectProducerArgs& args) {
PERFETTO_DCHECK(args.task_runner->RunsTasksOnCurrentThread());
auto endpoint = ProducerIPCClient::Connect(
@@ -47,6 +40,21 @@
return endpoint;
}
+} // namespace
+
+// static
+TracingBackend* SystemTracingBackend::GetInstance() {
+ static auto* instance = new SystemTracingBackend();
+ return instance;
+}
+
+SystemTracingBackend::SystemTracingBackend() {}
+
+std::unique_ptr<ProducerEndpoint> SystemTracingBackend::ConnectProducer(
+ const ConnectProducerArgs& args) {
+ return CreateProducerEndpoint(args);
+}
+
std::unique_ptr<ConsumerEndpoint> SystemTracingBackend::ConnectConsumer(
const ConnectConsumerArgs& args) {
auto endpoint = ConsumerIPCClient::Connect(GetConsumerSocket(), args.consumer,
@@ -55,5 +63,29 @@
return endpoint;
}
+// static
+TracingBackend* SystemTracingProducerOnlyBackend::GetInstance() {
+ static auto* instance = new SystemTracingProducerOnlyBackend();
+ return instance;
+}
+
+SystemTracingProducerOnlyBackend::SystemTracingProducerOnlyBackend() {}
+
+std::unique_ptr<ProducerEndpoint>
+SystemTracingProducerOnlyBackend::ConnectProducer(
+ const ConnectProducerArgs& args) {
+ return CreateProducerEndpoint(args);
+}
+
+std::unique_ptr<ConsumerEndpoint>
+SystemTracingProducerOnlyBackend::ConnectConsumer(
+ const ConnectConsumerArgs& args) {
+ base::ignore_result(args);
+ PERFETTO_FATAL(
+ "System backend consumer support disabled. "
+ "TracingInitArgs::enable_system_consumer was false");
+ return nullptr;
+}
+
} // namespace internal
} // namespace perfetto
diff --git a/src/tracing/internal/system_tracing_backend_fake.cc b/src/tracing/internal/system_tracing_backend_fake.cc
index 9ca90d0..ea992a1 100644
--- a/src/tracing/internal/system_tracing_backend_fake.cc
+++ b/src/tracing/internal/system_tracing_backend_fake.cc
@@ -27,5 +27,11 @@
return nullptr;
}
+// static
+TracingBackend* SystemTracingProducerOnlyBackend::GetInstance() {
+ PERFETTO_FATAL("System tracing not implemented");
+ return nullptr;
+}
+
} // namespace internal
} // namespace perfetto
diff --git a/src/tracing/internal/tracing_muxer_impl.cc b/src/tracing/internal/tracing_muxer_impl.cc
index dd34ca4..876b90b 100644
--- a/src/tracing/internal/tracing_muxer_impl.cc
+++ b/src/tracing/internal/tracing_muxer_impl.cc
@@ -761,6 +761,7 @@
rb.backend = backend;
rb.id = backend_id;
rb.type = type;
+ rb.consumer_enabled = type != kSystemBackend || args.enable_system_consumer;
rb.producer.reset(new ProducerImpl(this, backend_id,
args.shmem_batch_commits_duration_ms));
rb.producer_conn_args.producer = rb.producer.get();
@@ -1645,6 +1646,10 @@
continue;
}
+ if (!backend.consumer_enabled) {
+ continue;
+ }
+
TracingBackendId backend_id = backend.id;
// Create the consumer now, even if we have to ask the embedder below, so
diff --git a/src/tracing/internal/tracing_muxer_impl.h b/src/tracing/internal/tracing_muxer_impl.h
index 1841cd4..c545a0b 100644
--- a/src/tracing/internal/tracing_muxer_impl.h
+++ b/src/tracing/internal/tracing_muxer_impl.h
@@ -380,6 +380,8 @@
// The calling code can request more than one concurrently active tracing
// session for the same backend. We need to create one consumer per session.
std::vector<std::unique_ptr<ConsumerImpl>> consumers;
+
+ bool consumer_enabled = true;
};
void UpdateDataSourceOnAllBackends(RegisteredDataSource& rds,
diff --git a/src/tracing/test/api_integrationtest.cc b/src/tracing/test/api_integrationtest.cc
index 0604d09..98963fc 100644
--- a/src/tracing/test/api_integrationtest.cc
+++ b/src/tracing/test/api_integrationtest.cc
@@ -4952,6 +4952,44 @@
EXPECT_EQ(it, trace.packet().end());
}
+TEST(PerfettoApiInitTest, DisableSystemConsumer) {
+ g_test_tracing_policy->should_allow_consumer_connection = true;
+
+ if (!perfetto::test::StartSystemService()) {
+ GTEST_SKIP();
+ }
+
+ EXPECT_FALSE(perfetto::Tracing::IsInitialized());
+ TracingInitArgs args;
+ args.backends = perfetto::kSystemBackend;
+ args.tracing_policy = g_test_tracing_policy;
+ args.enable_system_consumer = false;
+ perfetto::Tracing::Initialize(args);
+
+ // If this wasn't the first test to run in this process, any producers
+ // connected to the old system service will have been disconnected by the
+ // service restarting above. Wait for all producers to connect again before
+ // proceeding with the test.
+ perfetto::test::SyncProducers();
+
+ perfetto::test::DisableReconnectLimit();
+
+ std::unique_ptr<perfetto::TracingSession> ts =
+ perfetto::Tracing::NewTrace(perfetto::kSystemBackend);
+
+ // Creating the consumer should cause an asynchronous disconnect error.
+ WaitableTestEvent got_error;
+ ts->SetOnErrorCallback([&](perfetto::TracingError error) {
+ EXPECT_EQ(perfetto::TracingError::kDisconnected, error.code);
+ EXPECT_FALSE(error.message.empty());
+ got_error.Notify();
+ });
+ got_error.Wait();
+ ts.reset();
+
+ perfetto::Tracing::ResetForTesting();
+}
+
struct BackendTypeAsString {
std::string operator()(
const ::testing::TestParamInfo<perfetto::BackendType>& info) const {
diff --git a/tools/gen_android_bp b/tools/gen_android_bp
index 11e5bea..8328e82 100755
--- a/tools/gen_android_bp
+++ b/tools/gen_android_bp
@@ -241,9 +241,9 @@
'libperfetto_client_experimental': [
('apex_available', {
'//apex_available:platform', 'com.android.art',
- 'com.android.art.debug'
+ 'com.android.art.debug', 'com.android.tethering'
}),
- ('min_sdk_version', 'S'),
+ ('min_sdk_version', '30'),
('shared_libs', {'liblog'}),
('export_include_dirs', {'include', buildflags_dir}),
],