xref: /aosp_15_r20/external/perfetto/docs/case-studies/android-boot-tracing.md (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker# Recording traces on Android boot
2*6dbdd20aSAndroid Build Coastguard Worker
3*6dbdd20aSAndroid Build Coastguard WorkerSince Android 13 (T), perfetto can be configured to automatically start
4*6dbdd20aSAndroid Build Coastguard Workerrecording traces on boot. This can be useful to profile the boot process.
5*6dbdd20aSAndroid Build Coastguard Worker
6*6dbdd20aSAndroid Build Coastguard Worker## Steps
7*6dbdd20aSAndroid Build Coastguard Worker
8*6dbdd20aSAndroid Build Coastguard Worker* Create a file with the desired [trace configuration](/docs/concepts/config.md)
9*6dbdd20aSAndroid Build Coastguard Worker  in Text format (not binary). Example (more in [/test/configs/](/test/configs/)):
10*6dbdd20aSAndroid Build Coastguard Worker  ```
11*6dbdd20aSAndroid Build Coastguard Worker  # One buffer allocated within the central tracing binary for the entire trace,
12*6dbdd20aSAndroid Build Coastguard Worker  # shared by the two data sources below.
13*6dbdd20aSAndroid Build Coastguard Worker  buffers {
14*6dbdd20aSAndroid Build Coastguard Worker    size_kb: 32768
15*6dbdd20aSAndroid Build Coastguard Worker    fill_policy: DISCARD
16*6dbdd20aSAndroid Build Coastguard Worker  }
17*6dbdd20aSAndroid Build Coastguard Worker
18*6dbdd20aSAndroid Build Coastguard Worker  # Ftrace data from the kernel, mainly the process scheduling events.
19*6dbdd20aSAndroid Build Coastguard Worker  data_sources {
20*6dbdd20aSAndroid Build Coastguard Worker    config {
21*6dbdd20aSAndroid Build Coastguard Worker      name: "linux.ftrace"
22*6dbdd20aSAndroid Build Coastguard Worker      target_buffer: 0
23*6dbdd20aSAndroid Build Coastguard Worker      ftrace_config {
24*6dbdd20aSAndroid Build Coastguard Worker        ftrace_events: "sched_switch"
25*6dbdd20aSAndroid Build Coastguard Worker        ftrace_events: "sched_waking"
26*6dbdd20aSAndroid Build Coastguard Worker        ftrace_events: "sched_wakeup_new"
27*6dbdd20aSAndroid Build Coastguard Worker
28*6dbdd20aSAndroid Build Coastguard Worker        ftrace_events: "task_newtask"
29*6dbdd20aSAndroid Build Coastguard Worker        ftrace_events: "task_rename"
30*6dbdd20aSAndroid Build Coastguard Worker
31*6dbdd20aSAndroid Build Coastguard Worker        ftrace_events: "sched_process_exec"
32*6dbdd20aSAndroid Build Coastguard Worker        ftrace_events: "sched_process_exit"
33*6dbdd20aSAndroid Build Coastguard Worker        ftrace_events: "sched_process_fork"
34*6dbdd20aSAndroid Build Coastguard Worker        ftrace_events: "sched_process_free"
35*6dbdd20aSAndroid Build Coastguard Worker        ftrace_events: "sched_process_hang"
36*6dbdd20aSAndroid Build Coastguard Worker        ftrace_events: "sched_process_wait"
37*6dbdd20aSAndroid Build Coastguard Worker      }
38*6dbdd20aSAndroid Build Coastguard Worker    }
39*6dbdd20aSAndroid Build Coastguard Worker  }
40*6dbdd20aSAndroid Build Coastguard Worker
41*6dbdd20aSAndroid Build Coastguard Worker  # Resolve process commandlines and parent/child relationships, to better
42*6dbdd20aSAndroid Build Coastguard Worker  # interpret the ftrace events, which are in terms of pids.
43*6dbdd20aSAndroid Build Coastguard Worker  data_sources {
44*6dbdd20aSAndroid Build Coastguard Worker    config {
45*6dbdd20aSAndroid Build Coastguard Worker      name: "linux.process_stats"
46*6dbdd20aSAndroid Build Coastguard Worker      target_buffer: 0
47*6dbdd20aSAndroid Build Coastguard Worker    }
48*6dbdd20aSAndroid Build Coastguard Worker  }
49*6dbdd20aSAndroid Build Coastguard Worker
50*6dbdd20aSAndroid Build Coastguard Worker  # 10s trace, but can be stopped prematurely via `adb shell pkill -u perfetto`.
51*6dbdd20aSAndroid Build Coastguard Worker  duration_ms: 10000
52*6dbdd20aSAndroid Build Coastguard Worker  ```
53*6dbdd20aSAndroid Build Coastguard Worker* Put the file on the device at `/data/misc/perfetto-configs/boottrace.pbtxt`:
54*6dbdd20aSAndroid Build Coastguard Worker  ```
55*6dbdd20aSAndroid Build Coastguard Worker  adb push <yourfile> /data/misc/perfetto-configs/boottrace.pbtxt
56*6dbdd20aSAndroid Build Coastguard Worker  ```
57*6dbdd20aSAndroid Build Coastguard Worker* Enable the `perfetto_trace_on_boot` service:
58*6dbdd20aSAndroid Build Coastguard Worker  ```
59*6dbdd20aSAndroid Build Coastguard Worker  adb shell setprop persist.debug.perfetto.boottrace 1
60*6dbdd20aSAndroid Build Coastguard Worker  ```
61*6dbdd20aSAndroid Build Coastguard Worker  The property is reset on boot. In order to trace the next boot, the command
62*6dbdd20aSAndroid Build Coastguard Worker  must be reissued.
63*6dbdd20aSAndroid Build Coastguard Worker* Reboot the device.
64*6dbdd20aSAndroid Build Coastguard Worker* The output trace will be written at
65*6dbdd20aSAndroid Build Coastguard Worker  `/data/misc/perfetto-traces/boottrace.perfetto-trace`. The file will be
66*6dbdd20aSAndroid Build Coastguard Worker  removed before a new trace is started.
67*6dbdd20aSAndroid Build Coastguard Worker  ```
68*6dbdd20aSAndroid Build Coastguard Worker  adb pull /data/misc/perfetto-traces/boottrace.perfetto-trace
69*6dbdd20aSAndroid Build Coastguard Worker  ```
70*6dbdd20aSAndroid Build Coastguard Worker  **N.B.:** The file will appear after the recording has stopped (be sure to set
71*6dbdd20aSAndroid Build Coastguard Worker  `duration_ms` to a reasonable value in the config) or after the first
72*6dbdd20aSAndroid Build Coastguard Worker  `flush_period_ms`.
73*6dbdd20aSAndroid Build Coastguard Worker* `boottrace.perfetto-trace` can now be opened in
74*6dbdd20aSAndroid Build Coastguard Worker  [ui.perfetto.dev](https://ui.perfetto.dev/)
75*6dbdd20aSAndroid Build Coastguard Worker
76*6dbdd20aSAndroid Build Coastguard Worker## Implementation details
77*6dbdd20aSAndroid Build Coastguard Worker* The trace will start only after persistent properties are loaded, which
78*6dbdd20aSAndroid Build Coastguard Worker  happens after /data has been mounted.
79*6dbdd20aSAndroid Build Coastguard Worker* The command to start the trace is implemented as oneshot init service.
80