1*6dbdd20aSAndroid Build Coastguard Worker# ATrace: Android system and app trace events 2*6dbdd20aSAndroid Build Coastguard Worker 3*6dbdd20aSAndroid Build Coastguard WorkerOn Android, native and managed apps can inject custom slices and counter trace 4*6dbdd20aSAndroid Build Coastguard Workerpoints into the trace. This is possible through the following: 5*6dbdd20aSAndroid Build Coastguard Worker 6*6dbdd20aSAndroid Build Coastguard Worker* Java/Kotlin apps (SDK): `android.os.Trace`. 7*6dbdd20aSAndroid Build Coastguard Worker See https://developer.android.com/reference/android/os/Trace. 8*6dbdd20aSAndroid Build Coastguard Worker 9*6dbdd20aSAndroid Build Coastguard Worker* Native processes (NDK): `ATrace_beginSection() / ATrace_setCounter()` defined 10*6dbdd20aSAndroid Build Coastguard Worker in `<trace.h>`. See https://developer.android.com/ndk/reference/group/tracing. 11*6dbdd20aSAndroid Build Coastguard Worker 12*6dbdd20aSAndroid Build Coastguard Worker* Android internal processes: `ATRACE_BEGIN()/ATRACE_INT()` defined in 13*6dbdd20aSAndroid Build Coastguard Worker [`libcutils/trace.h`][libcutils]. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard WorkerThis API has been available since Android 4.3 (API level 18) and predates 16*6dbdd20aSAndroid Build Coastguard WorkerPerfetto. All these annotations, which internally are all routed through the 17*6dbdd20aSAndroid Build Coastguard Workerinternal libcutils API, are and will continue to be supported by Perfetto. 18*6dbdd20aSAndroid Build Coastguard Worker 19*6dbdd20aSAndroid Build Coastguard WorkerThere are two types of atrace events: System and App events. 20*6dbdd20aSAndroid Build Coastguard Worker 21*6dbdd20aSAndroid Build Coastguard Worker**System events**: are emitted only by Android internals using libcutils. 22*6dbdd20aSAndroid Build Coastguard WorkerThese events are grouped in categories (also known as _tags_), e.g. 23*6dbdd20aSAndroid Build Coastguard Worker"am" (ActivityManager), "pm" (PackageManager). 24*6dbdd20aSAndroid Build Coastguard WorkerFor a full list of categories see the _Record new trace_ page of the 25*6dbdd20aSAndroid Build Coastguard Worker[Perfetto UI](https://ui.perfetto.dev). 26*6dbdd20aSAndroid Build Coastguard Worker 27*6dbdd20aSAndroid Build Coastguard WorkerCategories can be used to enable group of events across several processes, 28*6dbdd20aSAndroid Build Coastguard Workerwithout having to worry about which particular system process emits them. 29*6dbdd20aSAndroid Build Coastguard Worker 30*6dbdd20aSAndroid Build Coastguard Worker**App events**: have the same semantics of system events. Unlike system events, 31*6dbdd20aSAndroid Build Coastguard Workerhowever, they don't have any tag-filtering capability (all app events share the 32*6dbdd20aSAndroid Build Coastguard Workersame tag `ATRACE_TAG_APP`) but can be enabled on a per-app basis. 33*6dbdd20aSAndroid Build Coastguard Worker 34*6dbdd20aSAndroid Build Coastguard WorkerSee the [TraceConfig](#traceconfig) section below for instructions on how to 35*6dbdd20aSAndroid Build Coastguard Workerenable both system and app events. 36*6dbdd20aSAndroid Build Coastguard Worker 37*6dbdd20aSAndroid Build Coastguard Worker#### Instrumentation overhead 38*6dbdd20aSAndroid Build Coastguard Worker 39*6dbdd20aSAndroid Build Coastguard WorkerATrace instrumentation a non-negligible cost of 1-10us per event. 40*6dbdd20aSAndroid Build Coastguard WorkerThis is because each event involves a stringification, a JNI call if coming from 41*6dbdd20aSAndroid Build Coastguard Workera managed execution environment, and a user-space <-> kernel-space roundtrip to 42*6dbdd20aSAndroid Build Coastguard Workerwrite the marker into `/sys/kernel/debug/tracing/trace_marker` (which is the 43*6dbdd20aSAndroid Build Coastguard Workermost expensive part). 44*6dbdd20aSAndroid Build Coastguard Worker 45*6dbdd20aSAndroid Build Coastguard WorkerOur team is looking into a migration path for Android, in light of the newly 46*6dbdd20aSAndroid Build Coastguard Workerintroduced [Tracing SDK](/docs/instrumentation/tracing-sdk.md). At the moment 47*6dbdd20aSAndroid Build Coastguard Workerthe advice is to keep using the existing ATrace API on Android. 48*6dbdd20aSAndroid Build Coastguard Worker 49*6dbdd20aSAndroid Build Coastguard Worker[libcutils]: https://cs.android.com/android/platform/superproject/main/+/main:system/core/libcutils/include/cutils/trace.h?q=f:trace%20libcutils 50*6dbdd20aSAndroid Build Coastguard Worker 51*6dbdd20aSAndroid Build Coastguard Worker## UI 52*6dbdd20aSAndroid Build Coastguard Worker 53*6dbdd20aSAndroid Build Coastguard WorkerAt the UI level, these functions create slices and counters within the scope of 54*6dbdd20aSAndroid Build Coastguard Workera process track group, as follows: 55*6dbdd20aSAndroid Build Coastguard Worker 56*6dbdd20aSAndroid Build Coastguard Worker 57*6dbdd20aSAndroid Build Coastguard Worker 58*6dbdd20aSAndroid Build Coastguard Worker## SQL 59*6dbdd20aSAndroid Build Coastguard Worker 60*6dbdd20aSAndroid Build Coastguard WorkerAt the SQL level, ATrace events are available in the standard `slice` and 61*6dbdd20aSAndroid Build Coastguard Worker`counter` tables, together with other counters and slices coming from other 62*6dbdd20aSAndroid Build Coastguard Workerdata sources. 63*6dbdd20aSAndroid Build Coastguard Worker 64*6dbdd20aSAndroid Build Coastguard Worker### Slices 65*6dbdd20aSAndroid Build Coastguard Worker 66*6dbdd20aSAndroid Build Coastguard Worker```sql 67*6dbdd20aSAndroid Build Coastguard Workerselect s.ts, t.name as thread_name, t.tid, s.name as slice_name, s.dur 68*6dbdd20aSAndroid Build Coastguard Workerfrom slice as s left join thread_track as trk on s.track_id = trk.id 69*6dbdd20aSAndroid Build Coastguard Workerleft join thread as t on trk.utid = t.utid 70*6dbdd20aSAndroid Build Coastguard Worker``` 71*6dbdd20aSAndroid Build Coastguard Worker 72*6dbdd20aSAndroid Build Coastguard Workerts | thread_name | tid | slice_name | dur 73*6dbdd20aSAndroid Build Coastguard Worker---|-------------|-----|------------|---- 74*6dbdd20aSAndroid Build Coastguard Worker261190068051612 | android.anim | 1317 | dequeueBuffer | 623021 75*6dbdd20aSAndroid Build Coastguard Worker261190068636404 | android.anim | 1317 | importBuffer | 30312 76*6dbdd20aSAndroid Build Coastguard Worker261190068687289 | android.anim | 1317 | lockAsync | 2269428 77*6dbdd20aSAndroid Build Coastguard Worker261190068693852 | android.anim | 1317 | LockBuffer | 2255313 78*6dbdd20aSAndroid Build Coastguard Worker261190068696300 | android.anim | 1317 | MapBuffer | 36302 79*6dbdd20aSAndroid Build Coastguard Worker261190068734529 | android.anim | 1317 | CleanBuffer | 2211198 80*6dbdd20aSAndroid Build Coastguard Worker 81*6dbdd20aSAndroid Build Coastguard Worker### Counters 82*6dbdd20aSAndroid Build Coastguard Worker 83*6dbdd20aSAndroid Build Coastguard Worker```sql 84*6dbdd20aSAndroid Build Coastguard Workerselect ts, p.name as process_name, p.pid, t.name as counter_name, c.value 85*6dbdd20aSAndroid Build Coastguard Workerfrom counter as c left join process_counter_track as t on c.track_id = t.id 86*6dbdd20aSAndroid Build Coastguard Workerleft join process as p on t.upid = p.upid 87*6dbdd20aSAndroid Build Coastguard Worker``` 88*6dbdd20aSAndroid Build Coastguard Worker 89*6dbdd20aSAndroid Build Coastguard Workerts | process_name | pid | counter_name | value 90*6dbdd20aSAndroid Build Coastguard Worker---|--------------|-----|--------------|------ 91*6dbdd20aSAndroid Build Coastguard Worker261193227069635 | com.android.systemui | 1664 | GPU completion | 0 92*6dbdd20aSAndroid Build Coastguard Worker261193268649379 | com.android.systemui | 1664 | GPU completion | 1 93*6dbdd20aSAndroid Build Coastguard Worker261193269787139 | com.android.systemui | 1664 | HWC release | 1 94*6dbdd20aSAndroid Build Coastguard Worker261193270330890 | com.android.systemui | 1664 | GPU completion | 0 95*6dbdd20aSAndroid Build Coastguard Worker261193271282244 | com.android.systemui | 1664 | GPU completion | 1 96*6dbdd20aSAndroid Build Coastguard Worker261193277112817 | com.android.systemui | 1664 | HWC release | 0 97*6dbdd20aSAndroid Build Coastguard Worker 98*6dbdd20aSAndroid Build Coastguard Worker## TraceConfig 99*6dbdd20aSAndroid Build Coastguard Worker 100*6dbdd20aSAndroid Build Coastguard Worker```protobuf 101*6dbdd20aSAndroid Build Coastguard Workerbuffers { 102*6dbdd20aSAndroid Build Coastguard Worker size_kb: 102400 103*6dbdd20aSAndroid Build Coastguard Worker fill_policy: RING_BUFFER 104*6dbdd20aSAndroid Build Coastguard Worker} 105*6dbdd20aSAndroid Build Coastguard Worker 106*6dbdd20aSAndroid Build Coastguard Workerdata_sources { 107*6dbdd20aSAndroid Build Coastguard Worker config { 108*6dbdd20aSAndroid Build Coastguard Worker name: "linux.ftrace" 109*6dbdd20aSAndroid Build Coastguard Worker ftrace_config { 110*6dbdd20aSAndroid Build Coastguard Worker # Enables specific system events tags. 111*6dbdd20aSAndroid Build Coastguard Worker atrace_categories: "am" 112*6dbdd20aSAndroid Build Coastguard Worker atrace_categories: "pm" 113*6dbdd20aSAndroid Build Coastguard Worker 114*6dbdd20aSAndroid Build Coastguard Worker # Enables events for a specific app. 115*6dbdd20aSAndroid Build Coastguard Worker atrace_apps: "com.google.android.apps.docs" 116*6dbdd20aSAndroid Build Coastguard Worker 117*6dbdd20aSAndroid Build Coastguard Worker # Enables all events for all apps. 118*6dbdd20aSAndroid Build Coastguard Worker atrace_apps: "*" 119*6dbdd20aSAndroid Build Coastguard Worker } 120*6dbdd20aSAndroid Build Coastguard Worker } 121*6dbdd20aSAndroid Build Coastguard Worker} 122*6dbdd20aSAndroid Build Coastguard Worker``` 123