| # 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](/docs/concepts/config.md) |
| in Text format (not binary). Example (more in [/test/configs/](/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 set |
| `duration_ms` to a reasonable value in the config) or after the first |
| `flush_period_ms`. |
| * `boottrace.perfetto-trace` can now be opened in |
| [ui.perfetto.dev](https://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. |