Add perfetto persistent tracing
If a property is set (by shell or by a device build file), perfetto will
keep a simple tracing configuration active all the time.
One test needs to be updated because it assumed that no session with
bugreport_score was running on device. If the property is enabled, that
might not be the case anymore.
Bug: 325622427
Change-Id: I7663f121b44c67ea8d8e23a88c6fb1b588100bfa
diff --git a/Android.bp b/Android.bp
index a991cc1..fd67581 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1278,6 +1278,9 @@
defaults: [
"perfetto_defaults",
],
+ required: [
+ "perfetto_persistent_cfg.pbtxt",
+ ],
}
// GN: //src/base:perfetto_base_default_platform
@@ -15574,3 +15577,10 @@
],
output_extension: "srcjar",
}
+
+prebuilt_etc {
+ name: "perfetto_persistent_cfg.pbtxt",
+ filename: "persistent_cfg.pbtxt",
+ sub_dir: "perfetto",
+ src: "persistent_cfg.pbtxt",
+}
diff --git a/Android.bp.extras b/Android.bp.extras
index 9c7b0b0..14c7457 100644
--- a/Android.bp.extras
+++ b/Android.bp.extras
@@ -197,3 +197,10 @@
],
output_extension: "srcjar",
}
+
+prebuilt_etc {
+ name: "perfetto_persistent_cfg.pbtxt",
+ filename: "persistent_cfg.pbtxt",
+ sub_dir: "perfetto",
+ src: "persistent_cfg.pbtxt",
+}
diff --git a/perfetto.rc b/perfetto.rc
index 18432dc..3f1801d 100644
--- a/perfetto.rc
+++ b/perfetto.rc
@@ -156,3 +156,31 @@
setprop debug.hwui.skia_use_perfetto_track_events false
setprop debug.renderengine.skia_tracing_enabled false
setprop debug.renderengine.skia_use_perfetto_track_events false
+
+##############################################################################
+# perfetto_persistent_sysui_tracing_for_bugreport - Keeps a persistent active
+# tracing session, for debugging purposes
+##############################################################################
+
+on property:persist.debug.perfetto.persistent_sysui_tracing_for_bugreport=1 && property:persist.traced.enable=1 && property:ro.debuggable=1
+ # Set by traced after listen()ing on the consumer socket. Without this,
+ # perfetto could try to connect to traced before traced is ready to listen.
+ wait_for_prop sys.trace.traced_started 1
+ start perfetto_persistent_sysui_tracing_for_bugreport
+
+# If something disables traced, we don't want init to respawn the service (that will fail) continuously.
+on property:persist.traced.enable=0
+ stop perfetto_persistent_sysui_tracing_for_bugreport
+
+on property:persist.debug.perfetto.persistent_sysui_tracing_for_bugreport=0
+ setprop persist.debug.perfetto.persistent_sysui_tracing_for_bugreport ""
+
+on property:persist.debug.perfetto.persistent_sysui_tracing_for_bugreport=""
+ stop perfetto_persistent_sysui_tracing_for_bugreport
+
+service perfetto_persistent_sysui_tracing_for_bugreport /system/bin/perfetto -c /system/etc/perfetto/persistent_cfg.pbtxt --txt -o /dev/null
+ disabled
+ timeout_period 86400
+ restart_period 60
+ user nobody
+ group nobody
diff --git a/persistent_cfg.pbtxt b/persistent_cfg.pbtxt
new file mode 100644
index 0000000..7d802c0
--- /dev/null
+++ b/persistent_cfg.pbtxt
@@ -0,0 +1,59 @@
+# Persistent tracing configuration. Only enabled on some devices for debugging
+# purposes when the property persist.debug.perfetto.persistent is set to 1.
+
+bugreport_score: 5
+bugreport_filename: "sysui.pftrace"
+unique_session_name: "sysui_persistent"
+flush_timeout_ms: 10000
+compression_type: COMPRESSION_TYPE_DEFLATE
+
+# Buffer 0: for android.surfaceflinger.transactions
+buffers {
+ size_kb: 1024
+ fill_policy: RING_BUFFER
+}
+
+# Buffer 1: for android.surfaceflinger.layers
+buffers {
+ size_kb: 409600
+ fill_policy: RING_BUFFER
+ transfer_on_clone: true
+ clear_before_clone: true
+}
+
+# Buffer 2: for com.android.wm.shell.transition
+buffers {
+ size_kb: 32
+ fill_policy: RING_BUFFER
+}
+
+
+data_sources: {
+ config {
+ name: "android.surfaceflinger.transactions"
+ target_buffer: 0
+ surfaceflinger_transactions_config: {
+ mode: MODE_ACTIVE
+ }
+ }
+}
+
+data_sources: {
+ config {
+ name: "android.surfaceflinger.layers"
+ target_buffer: 1
+ surfaceflinger_layers_config: {
+ mode: MODE_GENERATED_BUGREPORT_ONLY
+ trace_flags: TRACE_FLAG_INPUT
+ trace_flags: TRACE_FLAG_BUFFERS
+ }
+ }
+}
+
+data_sources: {
+ config {
+ name: "com.android.wm.shell.transition"
+ target_buffer: 2
+ }
+}
+
diff --git a/test/cmdline_integrationtest.cc b/test/cmdline_integrationtest.cc
index 3ac6f22..6fd2b75 100644
--- a/test/cmdline_integrationtest.cc
+++ b/test/cmdline_integrationtest.cc
@@ -961,13 +961,24 @@
/*use_explicit_clone=*/true);
}
-// Regression test for b/279753347 .
+// Regression test for b/279753347: --save-for-bugreport would create an empty
+// file if no session with bugreport_score was active.
TEST_F(PerfettoCmdlineTest, UnavailableBugreportLeavesNoEmptyFiles) {
ScopedFileRemove remove_on_test_exit(GetBugreportTracePath());
Exec perfetto_br_proc = ExecPerfetto({"--save-for-bugreport"});
StartServiceIfRequiredNoNewExecsAfterThis();
perfetto_br_proc.Run(&stderr_);
- ASSERT_FALSE(base::FileExists(GetBugreportTracePath()));
+ // No file exists. Great.
+ if (!base::FileExists(GetBugreportTracePath())) {
+ return;
+ }
+ // A file exists. There are two possiblilities:
+ // 1. There was a bugreport_score session.
+ // 2. There was no bugreport_score session and we're hitting b/279753347.
+ //
+ // Let's check that we're not hitting b/279753347, by checking that the file
+ // is not empty.
+ EXPECT_NE(base::GetFileSize(GetBugreportTracePath()), 0);
}
// Tests that SaveTraceForBugreport() works also if the trace has triggers
diff --git a/tools/gen_android_bp b/tools/gen_android_bp
index 25157e0..561657d 100755
--- a/tools/gen_android_bp
+++ b/tools/gen_android_bp
@@ -282,6 +282,7 @@
('min_sdk_version', 'S'),
],
'libperfetto': [('export_include_dirs', {'include', buildflags_dir}),],
+ 'perfetto': [('required', {'perfetto_persistent_cfg.pbtxt'}),],
}