# Quickstart: Record traces on Android Perfetto allows you to collect system-wide performance traces from Android devices from a variety of data sources (kernel scheduler via ftrace, userspace instrumentation via atrace and all other data sources listed in this site). ## Starting the tracing services Perfetto is based on [platform services](/docs/concepts/service-model.md) that are avilable since Android 9 (P) but are enabled by default only since Android 11 (R). On Android 9 (P) and 10 (Q) you need to do the following to ensure that the tracing services are enabled before getting started: ```bash # Needed only on Android 9 (P) and 10 (Q) on non-Pixel phones. adb shell setprop persist.traced.enable 1 ``` If you are running a version of Android older than P, you can still capture a trace with Perfetto using the `record_android_trace` script. See instructions below in the [Recording a trace through the cmdline](#recording-a-trace-through-the-cmdline) section. ## Recording a trace Command line tools (usage examples below in this page): * Using the [`tools/record_android_trace`](/tools/record_android_trace) helper script. * Using directly the `/system/bin/perfetto` command on device [[reference](/docs/reference/perfetto-cli.md)]. UI tools: * Through the record page in the [Perfetto UI](https://ui.perfetto.dev). * Using the on-device [System Tracing App](https://developer.android.com/topic/performance/tracing/on-device) ### Recording a trace through the Perfetto UI Navigate to [ui.perfetto.dev](https://ui.perfetto.dev/#!/record) and select **Record new trace** from the left menu. From this page, select and turn on the data sources you want to include in the trace. More detail about the different data sources can be found in the _Data sources_ section of the docs. ![Record page of the Perfetto UI](/docs/images/record-trace.png) If you are unsure, start by turning on **Scheduling details** under the **CPU** tab. Ensure your device is connected and select **Add ADB device**. Once your device has successfully paired (you may need to allow USB debugging on the device), select the **Start Recording** button. Allow time for the trace to be collected (10s by default) and then you should see the trace appear. ![Perfetto UI with a trace loaded](/docs/images/trace-view.png) Your trace may look different depending on which data sources you enabled. ### Recording a trace through the cmdline **Prerequisites** For the cmdline based workflow you will need the `adb` (Android Debug Bridge) executable to be in your PATH. ADB binaries for Linux, Mac or Windows can be downloaded from https://developer.android.com/studio/releases/platform-tools . **Using the helper script** We suggest using the `tools/record_android_trace` script to record traces from the command line. It is the equivalent of running `adb shell perfetto` but it helps with getting the paths right, auto-pulling the trace once done and opening it on the browser. Furthermore, on older versions of Android it takes care of sideloading the `tracebox` binary to make up for the lack of tracing system services. If you are already familiar with `systrace` or `atrace`, both cmdline tools support a systrace-equivalent syntax: On Linux and Mac: ```bash curl -O https://raw.githubusercontent.com/google/perfetto/master/tools/record_android_trace chmod u+x record_android_trace # See ./record_android_trace --help for more ./record_android_trace -o trace_file.perfetto-trace -t 10s -b 32mb \ sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory ``` On Windows: ```bash curl -O https://raw.githubusercontent.com/google/perfetto/master/tools/record_android_trace python3 record_android_trace -o trace_file.perfetto-trace -t 10s -b 32mb \ sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory ``` **Using the on-device /system/bin/perfetto command** Or, if you want to use directly the on-device binary do instead: ```bash adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 20s \ sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory ``` Caveats when using directly the `adb shell perfetto` workflow: * Ctrl+C, which normally causes a graceful termination of the trace, is not propagated by ADB when using `adb shell perfetto` but only when using an interactive PTY-based session via `adb shell`. * On non-rooted devices before Android 12, the config can only be passed as `cat config | adb shell perfetto -c -` (-: stdin) because of over-restrictive SELinux rules. Since Android 12 `/data/misc/perfetto-configs` can be used for storing configs. * On devices before Android 10, adb cannot directly pull `/data/misc/perfetto-traces`. Use `adb shell cat /data/misc/perfetto-traces/trace > trace` to work around. * When capturing longer traces, e.g. in the context of benchmarks or CI, use `PID=$(perfetto --background)` and then `kill $PID` to stop. #### Full trace config The short syntax allows to enable only a subset of the data sources; for full control of the trace config, pass the full trace config in input. See the [_Trace configuration_ page](/docs/concepts/config.md) and the examples in each data source doc page for detailed instructions about how to configure all the various knobs of Perfetto. If you are running on a Mac or Linux host, or are using a bash-based terminal on Windows, you can use the following: WARNING: The below command does not work on Android P because the `--txt` option was introduced in Q. The binary protobuf format should be used instead; the details of this can be found on the [_Trace configuration_ page](https://perfetto.dev/docs/concepts/config#pbtx-vs-binary-format). ```bash cat<config.pbtx duration_ms: 10000 buffers: { size_kb: 8960 fill_policy: DISCARD } buffers: { size_kb: 1280 fill_policy: DISCARD } data_sources: { config { name: "linux.ftrace" ftrace_config { ftrace_events: "sched/sched_switch" ftrace_events: "power/suspend_resume" ftrace_events: "sched/sched_process_exit" ftrace_events: "sched/sched_process_free" ftrace_events: "task/task_newtask" ftrace_events: "task/task_rename" ftrace_events: "ftrace/print" atrace_categories: "gfx" atrace_categories: "view" atrace_categories: "webview" atrace_categories: "camera" atrace_categories: "dalvik" atrace_categories: "power" } } } data_sources: { config { name: "linux.process_stats" target_buffer: 1 process_stats_config { scan_all_processes_on_start: true } } } EOF ./record_android_trace -c config.pbtx -o trace_file.perfetto-trace ``` Or alternatively, when using directly the on-device command: ```bash cat config.pbtx | adb shell perfetto -c - --txt -o /data/misc/perfetto-traces/trace.perfetto-trace ``` Alternatively, first push the trace config file and then invoke perfetto: ```bash adb push config.pbtx /data/local/tmp/config.pbtx adb shell 'cat /data/local/tmp/config.pbtx | perfetto --txt -c - -o /data/misc/perfetto-traces/trace.perfetto-trace' ``` NOTE: because of strict SELinux rules, on non-rooted builds of Android, passing directly the file path as `-c /data/local/tmp/config` will fail, hence the `-c -` + stdin piping above. From Android 12 (S), `/data/misc/perfetto-configs/` can be used instead. Pull the file using `adb pull /data/misc/perfetto-traces/trace ~/trace.perfetto-trace` and open it in the [Perfetto UI](https://ui.perfetto.dev). NOTE: On devices before Android 10, adb cannot directly pull `/data/misc/perfetto-traces`. Use `adb shell cat /data/misc/perfetto-traces/trace > trace.perfetto-trace` to work around. The full reference for the `perfetto` cmdline interface can be found [here](/docs/reference/perfetto-cli.md).