xref: /aosp_15_r20/external/perfetto/docs/data-sources/atrace.md (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
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![](/docs/images/atrace-slices.png "ATrace slices in the UI")
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