1*6dbdd20aSAndroid Build Coastguard Worker# Quickstart: Callstack sampling on Android 2*6dbdd20aSAndroid Build Coastguard Worker 3*6dbdd20aSAndroid Build Coastguard Worker## Prerequisites 4*6dbdd20aSAndroid Build Coastguard Worker 5*6dbdd20aSAndroid Build Coastguard Worker- [ADB](https://developer.android.com/studio/command-line/adb) installed. 6*6dbdd20aSAndroid Build Coastguard Worker- A device running Android T+. 7*6dbdd20aSAndroid Build Coastguard Worker- Either a debuggable (`userdebug`/`eng`) Android image, or the apps to be 8*6dbdd20aSAndroid Build Coastguard Worker profiled need to be 9*6dbdd20aSAndroid Build Coastguard Worker [marked as profileable or debuggable](https://developer.android.com/guide/topics/manifest/profileable-element) 10*6dbdd20aSAndroid Build Coastguard Worker in their manifests. 11*6dbdd20aSAndroid Build Coastguard Worker 12*6dbdd20aSAndroid Build Coastguard Worker## Capture a CPU profile 13*6dbdd20aSAndroid Build Coastguard Worker 14*6dbdd20aSAndroid Build Coastguard Worker### Linux or macOS 15*6dbdd20aSAndroid Build Coastguard Worker 16*6dbdd20aSAndroid Build Coastguard WorkerMake sure `adb` is installed and in your `PATH`. 17*6dbdd20aSAndroid Build Coastguard Worker 18*6dbdd20aSAndroid Build Coastguard Worker```bash 19*6dbdd20aSAndroid Build Coastguard Workeradb devices -l 20*6dbdd20aSAndroid Build Coastguard Worker``` 21*6dbdd20aSAndroid Build Coastguard Worker 22*6dbdd20aSAndroid Build Coastguard WorkerIf more than one device or emulator is reported you must select one upfront as 23*6dbdd20aSAndroid Build Coastguard Workerfollows: 24*6dbdd20aSAndroid Build Coastguard Worker 25*6dbdd20aSAndroid Build Coastguard Worker```bash 26*6dbdd20aSAndroid Build Coastguard Workerexport ANDROID_SERIAL=SER123456 27*6dbdd20aSAndroid Build Coastguard Worker``` 28*6dbdd20aSAndroid Build Coastguard Worker 29*6dbdd20aSAndroid Build Coastguard WorkerDownload `cpu_profile` (if you don't have a Perfetto checkout): 30*6dbdd20aSAndroid Build Coastguard Worker 31*6dbdd20aSAndroid Build Coastguard Worker```bash 32*6dbdd20aSAndroid Build Coastguard Workercurl -LO https://raw.githubusercontent.com/google/perfetto/main/tools/cpu_profile 33*6dbdd20aSAndroid Build Coastguard Workerchmod +x cpu_profile 34*6dbdd20aSAndroid Build Coastguard Worker``` 35*6dbdd20aSAndroid Build Coastguard Worker 36*6dbdd20aSAndroid Build Coastguard WorkerThen, start profiling. For example, to profile the processes `com.android.foo` 37*6dbdd20aSAndroid Build Coastguard Workerand `com.android.bar`, use: 38*6dbdd20aSAndroid Build Coastguard Worker 39*6dbdd20aSAndroid Build Coastguard Worker```bash 40*6dbdd20aSAndroid Build Coastguard Worker./cpu_profile -n "com.android.foo,com.android.bar" 41*6dbdd20aSAndroid Build Coastguard Worker``` 42*6dbdd20aSAndroid Build Coastguard Worker 43*6dbdd20aSAndroid Build Coastguard WorkerBy default, profiling runs until manually terminated manually. To set a specific 44*6dbdd20aSAndroid Build Coastguard Workerduration for recording (e.g. 30 seconds), use: 45*6dbdd20aSAndroid Build Coastguard Worker 46*6dbdd20aSAndroid Build Coastguard Worker```bash 47*6dbdd20aSAndroid Build Coastguard Worker./cpu_profile -n "com.android.foo,com.android.bar" -d 30000 48*6dbdd20aSAndroid Build Coastguard Worker``` 49*6dbdd20aSAndroid Build Coastguard Worker 50*6dbdd20aSAndroid Build Coastguard WorkerTo change how frequently stack samples are recorded (e.g. 120 samples per 51*6dbdd20aSAndroid Build Coastguard Workersecond), set the `-f` argument: 52*6dbdd20aSAndroid Build Coastguard Worker 53*6dbdd20aSAndroid Build Coastguard Worker```bash 54*6dbdd20aSAndroid Build Coastguard Worker./cpu_profile -n "com.android.foo,com.android.bar" -f 120 55*6dbdd20aSAndroid Build Coastguard Worker``` 56*6dbdd20aSAndroid Build Coastguard Worker 57*6dbdd20aSAndroid Build Coastguard WorkerYou can also pass in parts of the names of the processes you want to profile by 58*6dbdd20aSAndroid Build Coastguard Workerenabling `--partial-matching/-p`. This matches processes that are already 59*6dbdd20aSAndroid Build Coastguard Workerrunning when profiling is started. For instance, to profile the processes 60*6dbdd20aSAndroid Build Coastguard Worker`com.android.foo` and `com.android.bar`, run: 61*6dbdd20aSAndroid Build Coastguard Worker 62*6dbdd20aSAndroid Build Coastguard Worker```bash 63*6dbdd20aSAndroid Build Coastguard Worker./cpu_profile -n "foo,bar" -p 64*6dbdd20aSAndroid Build Coastguard Worker``` 65*6dbdd20aSAndroid Build Coastguard Worker 66*6dbdd20aSAndroid Build Coastguard WorkerYou can also pass in a custom [Perfetto config](/docs/concepts/config.md), which 67*6dbdd20aSAndroid Build Coastguard Workeroverrides all of the options above, using the `-c` argument: 68*6dbdd20aSAndroid Build Coastguard Worker 69*6dbdd20aSAndroid Build Coastguard Worker```bash 70*6dbdd20aSAndroid Build Coastguard Worker./cpu_profile -c "path/to/perfetto.config" 71*6dbdd20aSAndroid Build Coastguard Worker``` 72*6dbdd20aSAndroid Build Coastguard Worker 73*6dbdd20aSAndroid Build Coastguard WorkerTo change where profiles are output, use the `-o` argument: 74*6dbdd20aSAndroid Build Coastguard Worker 75*6dbdd20aSAndroid Build Coastguard Worker```bash 76*6dbdd20aSAndroid Build Coastguard Worker./cpu_profile -n "com.android.foo,com.android.bar" -o "path/to/output/directory" 77*6dbdd20aSAndroid Build Coastguard Worker``` 78*6dbdd20aSAndroid Build Coastguard Worker 79*6dbdd20aSAndroid Build Coastguard Worker### Windows 80*6dbdd20aSAndroid Build Coastguard Worker 81*6dbdd20aSAndroid Build Coastguard WorkerMake sure that the downloaded `adb.exe` is in the `PATH`. 82*6dbdd20aSAndroid Build Coastguard Worker 83*6dbdd20aSAndroid Build Coastguard Worker```bash 84*6dbdd20aSAndroid Build Coastguard Workerset PATH=%PATH%;%USERPROFILE%\Downloads\platform-tools 85*6dbdd20aSAndroid Build Coastguard Worker 86*6dbdd20aSAndroid Build Coastguard Workeradb devices -l 87*6dbdd20aSAndroid Build Coastguard Worker``` 88*6dbdd20aSAndroid Build Coastguard Worker 89*6dbdd20aSAndroid Build Coastguard WorkerIf more than one device or emulator is reported you must select one upfront as 90*6dbdd20aSAndroid Build Coastguard Workerfollows: 91*6dbdd20aSAndroid Build Coastguard Worker 92*6dbdd20aSAndroid Build Coastguard Worker```bash 93*6dbdd20aSAndroid Build Coastguard Workerset ANDROID_SERIAL=SER123456 94*6dbdd20aSAndroid Build Coastguard Worker``` 95*6dbdd20aSAndroid Build Coastguard Worker 96*6dbdd20aSAndroid Build Coastguard WorkerDownload the 97*6dbdd20aSAndroid Build Coastguard Worker[`cpu_profile`](https://raw.githubusercontent.com/google/perfetto/main/tools/cpu_profile) 98*6dbdd20aSAndroid Build Coastguard Workerscript. Then, start profiling. For example, to profile the processes 99*6dbdd20aSAndroid Build Coastguard Worker`com.android.foo` and `com.android.bar`, use: 100*6dbdd20aSAndroid Build Coastguard Worker 101*6dbdd20aSAndroid Build Coastguard Worker```bash 102*6dbdd20aSAndroid Build Coastguard Workerpython3 /path/to/cpu_profile -n "com.android.foo,com.android.bar" 103*6dbdd20aSAndroid Build Coastguard Worker``` 104*6dbdd20aSAndroid Build Coastguard Worker 105*6dbdd20aSAndroid Build Coastguard WorkerPlease see the [Linux or maxOS section](#linux-or-macos) for more examples. 106*6dbdd20aSAndroid Build Coastguard Worker 107*6dbdd20aSAndroid Build Coastguard Worker## Symbolization 108*6dbdd20aSAndroid Build Coastguard Worker 109*6dbdd20aSAndroid Build Coastguard WorkerYou may need to symbolize the collected profiles if they are missing symbols. 110*6dbdd20aSAndroid Build Coastguard WorkerSee [this](/docs/data-sources/native-heap-profiler#symbolize-your-profile) for 111*6dbdd20aSAndroid Build Coastguard Workermore details on how to do this. 112*6dbdd20aSAndroid Build Coastguard Worker 113*6dbdd20aSAndroid Build Coastguard WorkerFor example, to profile and symbolize the profiles for the process 114*6dbdd20aSAndroid Build Coastguard Worker`com.android.foo`, run: 115*6dbdd20aSAndroid Build Coastguard Worker 116*6dbdd20aSAndroid Build Coastguard Worker```bash 117*6dbdd20aSAndroid Build Coastguard WorkerPERFETTO_SYMBOLIZER_MODE=index PERFETTO_BINARY_PATH=path/to/directory/with/symbols/ ./cpu_profile -n "com.android.foo" 118*6dbdd20aSAndroid Build Coastguard Worker``` 119*6dbdd20aSAndroid Build Coastguard Worker 120*6dbdd20aSAndroid Build Coastguard Worker## View profile 121*6dbdd20aSAndroid Build Coastguard Worker 122*6dbdd20aSAndroid Build Coastguard WorkerUpload the `raw-trace` or `symbolized-trace` file from the output directory to 123*6dbdd20aSAndroid Build Coastguard Workerthe [Perfetto UI](https://ui.perfetto.dev) and click and drag over one or more 124*6dbdd20aSAndroid Build Coastguard Workerof the diamond markers in the UI track named "Perf Samples" for the processes 125*6dbdd20aSAndroid Build Coastguard Workerthat you selected for profiling. Each diamond marker represents a snapshot of 126*6dbdd20aSAndroid Build Coastguard Workerthe call-stack at that point on the timeline. 127*6dbdd20aSAndroid Build Coastguard Worker 128*6dbdd20aSAndroid Build Coastguard Worker 129*6dbdd20aSAndroid Build Coastguard Worker 130*6dbdd20aSAndroid Build Coastguard Worker 131*6dbdd20aSAndroid Build Coastguard Worker`cpu_profile` will also write separate profiles for each process that it 132*6dbdd20aSAndroid Build Coastguard Workerprofiled in the output directory, and those can be visualized using 133*6dbdd20aSAndroid Build Coastguard Worker[`pprof`](https://github.com/google/pprof). You can merge them into one by 134*6dbdd20aSAndroid Build Coastguard Workerpassing all of them to pprof, e.g. 135*6dbdd20aSAndroid Build Coastguard Worker`pprof /tmp/perf_profile-240105114948clvad/*`. 136