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