Recording traces on Android boot
Since Android 13 (T), perfetto can be configured to automatically start recording traces on boot. This can be useful to profile the boot process.
Steps
- Create a file with the desired trace configuration
in Text format (not binary). Example (more in /test/configs/):
# One buffer allocated within the central tracing binary for the entire trace, # shared by the two data sources below. buffers { size_kb: 32768 fill_policy: DISCARD } # Ftrace data from the kernel, mainly the process scheduling events. data_sources { config { name: "linux.ftrace" target_buffer: 0 ftrace_config { ftrace_events: "sched_switch" ftrace_events: "sched_waking" ftrace_events: "sched_wakeup_new" ftrace_events: "task_newtask" ftrace_events: "task_rename" ftrace_events: "sched_process_exec" ftrace_events: "sched_process_exit" ftrace_events: "sched_process_fork" ftrace_events: "sched_process_free" ftrace_events: "sched_process_hang" ftrace_events: "sched_process_wait" } } } # Resolve process commandlines and parent/child relationships, to better # interpret the ftrace events, which are in terms of pids. data_sources { config { name: "linux.process_stats" target_buffer: 0 } } # 10s trace, but can be stopped prematurely via `adb shell pkill -u perfetto`. duration_ms: 10000
- Put the file on the device at
/data/misc/perfetto-configs/boottrace.pbtxt
:adb push <yourfile> /data/misc/perfetto-configs/boottrace.pbtxt
- Enable the
perfetto_trace_on_boot
service:adb shell setprop persist.debug.perfetto.boottrace 1
The property is reset on boot. In order to trace the next boot, the command must be reissued. - Reboot the device.
- The output trace will be written at
/data/misc/perfetto-traces/boottrace.perfetto-trace
. The file will be removed before a new trace is started.adb pull /data/misc/perfetto-traces/boottrace.perfetto-trace
N.B.: The file will appear after the recording has stopped (be sure to setduration_ms
to a reasonable value in the config) or after the firstflush_period_ms
. boottrace.perfetto-trace
can now be opened in ui.perfetto.dev
Implementation details
- The trace will start only after persistent properties are loaded, which happens after /data has been mounted.
- The command to start the trace is implemented as oneshot init service.