1*6dbdd20aSAndroid Build Coastguard Worker# Writing TrackEvent Protos Synthetically 2*6dbdd20aSAndroid Build Coastguard Worker 3*6dbdd20aSAndroid Build Coastguard WorkerThis page acts as a reference guide to synthetically generate TrackEvent, 4*6dbdd20aSAndroid Build Coastguard WorkerPerfetto's native protobuf based tracing format. This allows using Perfetto's 5*6dbdd20aSAndroid Build Coastguard Workeranalysis and visualzation without using collecting traces using the Perfetto 6*6dbdd20aSAndroid Build Coastguard WorkerSDK. 7*6dbdd20aSAndroid Build Coastguard Worker 8*6dbdd20aSAndroid Build Coastguard WorkerTrackEvent protos can be manually written using the 9*6dbdd20aSAndroid Build Coastguard Worker[official protobuf library](https://protobuf.dev/reference/) or any other 10*6dbdd20aSAndroid Build Coastguard Workerprotobuf-compatible library. To be language-agnostic, the rest of this page will 11*6dbdd20aSAndroid Build Coastguard Workershow examples using the 12*6dbdd20aSAndroid Build Coastguard Worker[text format](https://protobuf.dev/reference/protobuf/textformat-spec/) 13*6dbdd20aSAndroid Build Coastguard Workerrepresentation of protobufs. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard WorkerThe root container of the protobuf-based traces is the 16*6dbdd20aSAndroid Build Coastguard Worker[Trace](https://cs.android.com/android/platform/superproject/main/+/main:external/perfetto/protos/perfetto/trace/trace.proto) 17*6dbdd20aSAndroid Build Coastguard Workermessage which itself is simply a repeated field of 18*6dbdd20aSAndroid Build Coastguard Worker[TracePacket](https://cs.android.com/android/platform/superproject/main/+/main:external/perfetto/protos/perfetto/trace/trace_packet.proto) 19*6dbdd20aSAndroid Build Coastguard Workermessages. 20*6dbdd20aSAndroid Build Coastguard Worker 21*6dbdd20aSAndroid Build Coastguard Worker## Thread-scoped (sync) slices 22*6dbdd20aSAndroid Build Coastguard Worker 23*6dbdd20aSAndroid Build Coastguard WorkerNOTE: in the legacy JSON tracing format, this section correspond to B/E/I/X 24*6dbdd20aSAndroid Build Coastguard Workerevents with the associated M (metadata) events. 25*6dbdd20aSAndroid Build Coastguard Worker 26*6dbdd20aSAndroid Build Coastguard WorkerThread scoped slices are used to trace execution of functions on a single 27*6dbdd20aSAndroid Build Coastguard Workerthread. As only one function runs on a single thread over time, this requires 28*6dbdd20aSAndroid Build Coastguard Workerthat child slices nest perfectly inside parent slices and do not partially 29*6dbdd20aSAndroid Build Coastguard Workeroverlap. 30*6dbdd20aSAndroid Build Coastguard Worker 31*6dbdd20aSAndroid Build Coastguard Worker 32*6dbdd20aSAndroid Build Coastguard Worker 33*6dbdd20aSAndroid Build Coastguard WorkerThis is corresponds to the following protos: 34*6dbdd20aSAndroid Build Coastguard Worker 35*6dbdd20aSAndroid Build Coastguard Worker``` 36*6dbdd20aSAndroid Build Coastguard Worker# Emit this packet once *before* you emit the first event for this process. 37*6dbdd20aSAndroid Build Coastguard Workerpacket { 38*6dbdd20aSAndroid Build Coastguard Worker track_descriptor: { 39*6dbdd20aSAndroid Build Coastguard Worker uuid: 894893984 # 64-bit random number. 40*6dbdd20aSAndroid Build Coastguard Worker process: { 41*6dbdd20aSAndroid Build Coastguard Worker pid: 1234 # PID for your process. 42*6dbdd20aSAndroid Build Coastguard Worker process_name: "My process name" 43*6dbdd20aSAndroid Build Coastguard Worker } 44*6dbdd20aSAndroid Build Coastguard Worker } 45*6dbdd20aSAndroid Build Coastguard Worker} 46*6dbdd20aSAndroid Build Coastguard Worker 47*6dbdd20aSAndroid Build Coastguard Worker# Emit this packet once *before* you emit the first event for this thread. 48*6dbdd20aSAndroid Build Coastguard Workerpacket { 49*6dbdd20aSAndroid Build Coastguard Worker track_descriptor: { 50*6dbdd20aSAndroid Build Coastguard Worker uuid: 49083589894 # 64-bit random number. 51*6dbdd20aSAndroid Build Coastguard Worker thread: { 52*6dbdd20aSAndroid Build Coastguard Worker pid: 1234 # PID for your process. 53*6dbdd20aSAndroid Build Coastguard Worker tid: 5678 # TID for your thread. 54*6dbdd20aSAndroid Build Coastguard Worker thread_name: "My thread name" 55*6dbdd20aSAndroid Build Coastguard Worker } 56*6dbdd20aSAndroid Build Coastguard Worker } 57*6dbdd20aSAndroid Build Coastguard Worker} 58*6dbdd20aSAndroid Build Coastguard Worker 59*6dbdd20aSAndroid Build Coastguard Worker# The events for this thread. 60*6dbdd20aSAndroid Build Coastguard Workerpacket { 61*6dbdd20aSAndroid Build Coastguard Worker timestamp: 200 62*6dbdd20aSAndroid Build Coastguard Worker track_event: { 63*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_BEGIN 64*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 49083589894 # Same random number from above. 65*6dbdd20aSAndroid Build Coastguard Worker name: "My special parent" 66*6dbdd20aSAndroid Build Coastguard Worker } 67*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 # Generate *once*, use throughout. 68*6dbdd20aSAndroid Build Coastguard Worker} 69*6dbdd20aSAndroid Build Coastguard Workerpacket { 70*6dbdd20aSAndroid Build Coastguard Worker timestamp: 250 71*6dbdd20aSAndroid Build Coastguard Worker track_event: { 72*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_BEGIN 73*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 49083589894 74*6dbdd20aSAndroid Build Coastguard Worker name: "My special child" 75*6dbdd20aSAndroid Build Coastguard Worker } 76*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 77*6dbdd20aSAndroid Build Coastguard Worker} 78*6dbdd20aSAndroid Build Coastguard Workerpacket { 79*6dbdd20aSAndroid Build Coastguard Worker timestamp: 285 80*6dbdd20aSAndroid Build Coastguard Worker track_event { 81*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_INSTANT 82*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 49083589894 83*6dbdd20aSAndroid Build Coastguard Worker } 84*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 85*6dbdd20aSAndroid Build Coastguard Worker} 86*6dbdd20aSAndroid Build Coastguard Workerpacket { 87*6dbdd20aSAndroid Build Coastguard Worker timestamp: 290 88*6dbdd20aSAndroid Build Coastguard Worker track_event: { 89*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_END 90*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 49083589894 91*6dbdd20aSAndroid Build Coastguard Worker } 92*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 93*6dbdd20aSAndroid Build Coastguard Worker} 94*6dbdd20aSAndroid Build Coastguard Workerpacket { 95*6dbdd20aSAndroid Build Coastguard Worker timestamp: 300 96*6dbdd20aSAndroid Build Coastguard Worker track_event: { 97*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_END 98*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 49083589894 99*6dbdd20aSAndroid Build Coastguard Worker } 100*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 101*6dbdd20aSAndroid Build Coastguard Worker} 102*6dbdd20aSAndroid Build Coastguard Worker``` 103*6dbdd20aSAndroid Build Coastguard Worker 104*6dbdd20aSAndroid Build Coastguard Worker## Process-scoped (async) slices 105*6dbdd20aSAndroid Build Coastguard Worker 106*6dbdd20aSAndroid Build Coastguard WorkerNOTE: in the legacy JSON tracing format, this section corresponds to b/e/n 107*6dbdd20aSAndroid Build Coastguard Workerevents with the associated M (metadata) events. 108*6dbdd20aSAndroid Build Coastguard Worker 109*6dbdd20aSAndroid Build Coastguard WorkerProcess-scoped slices are useful to trace execution of a "piece of work" across 110*6dbdd20aSAndroid Build Coastguard Workermultiple threads of a process. A process-scoped slice can start on a thread A 111*6dbdd20aSAndroid Build Coastguard Workerand end on a thread B. Examples include work submitted to thread pools and 112*6dbdd20aSAndroid Build Coastguard Workercoroutines. 113*6dbdd20aSAndroid Build Coastguard Worker 114*6dbdd20aSAndroid Build Coastguard WorkerProcess tracks can be named corresponding to the executor and can also have 115*6dbdd20aSAndroid Build Coastguard Workerchild slices in an identical way to thread-scoped slices. Importantly, this 116*6dbdd20aSAndroid Build Coastguard Workermeans slices on a single track must **strictly nest** inside each other without 117*6dbdd20aSAndroid Build Coastguard Workeroverlapping. 118*6dbdd20aSAndroid Build Coastguard Worker 119*6dbdd20aSAndroid Build Coastguard WorkerAs separating each track in the UI can cause a lot of clutter, the UI visually 120*6dbdd20aSAndroid Build Coastguard Workermerges process tracks with the same name in each process. Note that this **does 121*6dbdd20aSAndroid Build Coastguard Workernot** change the data model (e.g. in trace processor tracks remain separated) as 122*6dbdd20aSAndroid Build Coastguard Workerthis is simply a visual grouping. 123*6dbdd20aSAndroid Build Coastguard Worker 124*6dbdd20aSAndroid Build Coastguard Worker 125*6dbdd20aSAndroid Build Coastguard Worker 126*6dbdd20aSAndroid Build Coastguard WorkerThis is corresponds to the following protos: 127*6dbdd20aSAndroid Build Coastguard Worker 128*6dbdd20aSAndroid Build Coastguard Worker``` 129*6dbdd20aSAndroid Build Coastguard Worker# The first track associated with this process. 130*6dbdd20aSAndroid Build Coastguard Workerpacket { 131*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 132*6dbdd20aSAndroid Build Coastguard Worker uuid: 48948 # 64-bit random number. 133*6dbdd20aSAndroid Build Coastguard Worker name: "My special track" 134*6dbdd20aSAndroid Build Coastguard Worker process { 135*6dbdd20aSAndroid Build Coastguard Worker pid: 1234 # PID for your process 136*6dbdd20aSAndroid Build Coastguard Worker process_name: "My process name" 137*6dbdd20aSAndroid Build Coastguard Worker } 138*6dbdd20aSAndroid Build Coastguard Worker } 139*6dbdd20aSAndroid Build Coastguard Worker} 140*6dbdd20aSAndroid Build Coastguard Worker# The events for the first track. 141*6dbdd20aSAndroid Build Coastguard Workerpacket { 142*6dbdd20aSAndroid Build Coastguard Worker timestamp: 200 143*6dbdd20aSAndroid Build Coastguard Worker track_event { 144*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_BEGIN 145*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 48948 # Same random number from above. 146*6dbdd20aSAndroid Build Coastguard Worker name: "My special parent A" 147*6dbdd20aSAndroid Build Coastguard Worker } 148*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 # Generate *once*, use throughout. 149*6dbdd20aSAndroid Build Coastguard Worker} 150*6dbdd20aSAndroid Build Coastguard Workerpacket { 151*6dbdd20aSAndroid Build Coastguard Worker timestamp: 250 152*6dbdd20aSAndroid Build Coastguard Worker track_event { 153*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_BEGIN 154*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 48948 155*6dbdd20aSAndroid Build Coastguard Worker name: "My special child" 156*6dbdd20aSAndroid Build Coastguard Worker } 157*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 158*6dbdd20aSAndroid Build Coastguard Worker} 159*6dbdd20aSAndroid Build Coastguard Workerpacket { 160*6dbdd20aSAndroid Build Coastguard Worker timestamp: 290 161*6dbdd20aSAndroid Build Coastguard Worker track_event { 162*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_END 163*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 48948 164*6dbdd20aSAndroid Build Coastguard Worker } 165*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 166*6dbdd20aSAndroid Build Coastguard Worker} 167*6dbdd20aSAndroid Build Coastguard Workerpacket { 168*6dbdd20aSAndroid Build Coastguard Worker timestamp: 300 169*6dbdd20aSAndroid Build Coastguard Worker track_event { 170*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_END 171*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 48948 172*6dbdd20aSAndroid Build Coastguard Worker } 173*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 174*6dbdd20aSAndroid Build Coastguard Worker} 175*6dbdd20aSAndroid Build Coastguard Worker 176*6dbdd20aSAndroid Build Coastguard Worker# The second track associated with this process. Note how we make the above 177*6dbdd20aSAndroid Build Coastguard Worker# track the "parent" of this track: this means that this track also is 178*6dbdd20aSAndroid Build Coastguard Worker# associated to the same process. Note further this shows as the same visual 179*6dbdd20aSAndroid Build Coastguard Worker# track in the UI but remains separate in the trace and data model. Emitting 180*6dbdd20aSAndroid Build Coastguard Worker# these events on a separate track is necessary because these events overlap 181*6dbdd20aSAndroid Build Coastguard Worker# *without* nesting with the above events. 182*6dbdd20aSAndroid Build Coastguard Workerpacket { 183*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 184*6dbdd20aSAndroid Build Coastguard Worker uuid: 2390190934 # 64-bit random number. 185*6dbdd20aSAndroid Build Coastguard Worker name: "My special track" 186*6dbdd20aSAndroid Build Coastguard Worker parent_uuid: 48948 187*6dbdd20aSAndroid Build Coastguard Worker } 188*6dbdd20aSAndroid Build Coastguard Worker} 189*6dbdd20aSAndroid Build Coastguard Worker# The events for the second track. 190*6dbdd20aSAndroid Build Coastguard Workerpacket { 191*6dbdd20aSAndroid Build Coastguard Worker timestamp: 230 192*6dbdd20aSAndroid Build Coastguard Worker track_event { 193*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_BEGIN 194*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 2390190934 # Same random number from above. 195*6dbdd20aSAndroid Build Coastguard Worker name: "My special parent A" 196*6dbdd20aSAndroid Build Coastguard Worker } 197*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 198*6dbdd20aSAndroid Build Coastguard Worker} 199*6dbdd20aSAndroid Build Coastguard Workerpacket { 200*6dbdd20aSAndroid Build Coastguard Worker timestamp: 260 201*6dbdd20aSAndroid Build Coastguard Worker track_event { 202*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_BEGIN 203*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 2390190934 204*6dbdd20aSAndroid Build Coastguard Worker name: "My special child" 205*6dbdd20aSAndroid Build Coastguard Worker } 206*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 207*6dbdd20aSAndroid Build Coastguard Worker} 208*6dbdd20aSAndroid Build Coastguard Workerpacket { 209*6dbdd20aSAndroid Build Coastguard Worker timestamp: 270 210*6dbdd20aSAndroid Build Coastguard Worker track_event { 211*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_END 212*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 2390190934 213*6dbdd20aSAndroid Build Coastguard Worker } 214*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 215*6dbdd20aSAndroid Build Coastguard Worker} 216*6dbdd20aSAndroid Build Coastguard Workerpacket { 217*6dbdd20aSAndroid Build Coastguard Worker timestamp: 295 218*6dbdd20aSAndroid Build Coastguard Worker track_event { 219*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_END 220*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 2390190934 221*6dbdd20aSAndroid Build Coastguard Worker } 222*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 223*6dbdd20aSAndroid Build Coastguard Worker} 224*6dbdd20aSAndroid Build Coastguard Worker``` 225*6dbdd20aSAndroid Build Coastguard Worker 226*6dbdd20aSAndroid Build Coastguard Worker## Custom-scoped slices 227*6dbdd20aSAndroid Build Coastguard Worker 228*6dbdd20aSAndroid Build Coastguard WorkerNOTE: there is no equivalent in the JSON tracing format. 229*6dbdd20aSAndroid Build Coastguard Worker 230*6dbdd20aSAndroid Build Coastguard WorkerAs well as thread-scoped and process-scoped slices, Perfetto supports creating 231*6dbdd20aSAndroid Build Coastguard Workertracks which are not scoped to any OS-level concept. Moreover, these tracks can 232*6dbdd20aSAndroid Build Coastguard Workerbe recursively nested in a tree structure. This is useful to model the timeline 233*6dbdd20aSAndroid Build Coastguard Workerof execution of GPUs, network traffic, IRQs etc. 234*6dbdd20aSAndroid Build Coastguard Worker 235*6dbdd20aSAndroid Build Coastguard WorkerNote: in the past, modelling such slices may have been done by abusing 236*6dbdd20aSAndroid Build Coastguard Workerprocesses/threads slices, due to limitations with the data model and the 237*6dbdd20aSAndroid Build Coastguard WorkerPerfetto UI. This is no longer necessary and we _strongly_ discourage continued 238*6dbdd20aSAndroid Build Coastguard Workeruse of this hack. 239*6dbdd20aSAndroid Build Coastguard Worker 240*6dbdd20aSAndroid Build Coastguard Worker 241*6dbdd20aSAndroid Build Coastguard Worker 242*6dbdd20aSAndroid Build Coastguard WorkerThis is corresponds to the following protos: 243*6dbdd20aSAndroid Build Coastguard Worker 244*6dbdd20aSAndroid Build Coastguard Worker``` 245*6dbdd20aSAndroid Build Coastguard Workerpacket { 246*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 247*6dbdd20aSAndroid Build Coastguard Worker uuid: 48948 # 64-bit random number. 248*6dbdd20aSAndroid Build Coastguard Worker name: "Root" 249*6dbdd20aSAndroid Build Coastguard Worker } 250*6dbdd20aSAndroid Build Coastguard Worker} 251*6dbdd20aSAndroid Build Coastguard Workerpacket { 252*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 253*6dbdd20aSAndroid Build Coastguard Worker uuid: 50001 # 64-bit random number. 254*6dbdd20aSAndroid Build Coastguard Worker parent_uuid: 48948 # UUID of root track. 255*6dbdd20aSAndroid Build Coastguard Worker name: "Parent B" 256*6dbdd20aSAndroid Build Coastguard Worker } 257*6dbdd20aSAndroid Build Coastguard Worker} 258*6dbdd20aSAndroid Build Coastguard Workerpacket { 259*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 260*6dbdd20aSAndroid Build Coastguard Worker uuid: 50000 # 64-bit random number. 261*6dbdd20aSAndroid Build Coastguard Worker parent_uuid: 48948 # UUID of root track. 262*6dbdd20aSAndroid Build Coastguard Worker name: "Parent A" 263*6dbdd20aSAndroid Build Coastguard Worker } 264*6dbdd20aSAndroid Build Coastguard Worker} 265*6dbdd20aSAndroid Build Coastguard Workerpacket { 266*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 267*6dbdd20aSAndroid Build Coastguard Worker uuid: 60000 # 64-bit random number. 268*6dbdd20aSAndroid Build Coastguard Worker parent_uuid: 50000 # UUID of Parent A track. 269*6dbdd20aSAndroid Build Coastguard Worker name: "Child A1" 270*6dbdd20aSAndroid Build Coastguard Worker } 271*6dbdd20aSAndroid Build Coastguard Worker} 272*6dbdd20aSAndroid Build Coastguard Workerpacket { 273*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 274*6dbdd20aSAndroid Build Coastguard Worker uuid: 60001 # 64-bit random number. 275*6dbdd20aSAndroid Build Coastguard Worker parent_uuid: 50000 # UUID of Parent A track. 276*6dbdd20aSAndroid Build Coastguard Worker name: "Child A2" 277*6dbdd20aSAndroid Build Coastguard Worker } 278*6dbdd20aSAndroid Build Coastguard Worker} 279*6dbdd20aSAndroid Build Coastguard Workerpacket { 280*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 281*6dbdd20aSAndroid Build Coastguard Worker uuid: 70000 # 64-bit random number. 282*6dbdd20aSAndroid Build Coastguard Worker parent_uuid: 50001 # UUID of Parent B track. 283*6dbdd20aSAndroid Build Coastguard Worker name: "Child B1" 284*6dbdd20aSAndroid Build Coastguard Worker } 285*6dbdd20aSAndroid Build Coastguard Worker} 286*6dbdd20aSAndroid Build Coastguard Worker 287*6dbdd20aSAndroid Build Coastguard Worker# The events for the Child A1 track. 288*6dbdd20aSAndroid Build Coastguard Workerpacket { 289*6dbdd20aSAndroid Build Coastguard Worker timestamp: 200 290*6dbdd20aSAndroid Build Coastguard Worker track_event { 291*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_BEGIN 292*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 60000 # Same random number from above. 293*6dbdd20aSAndroid Build Coastguard Worker name: "A1" 294*6dbdd20aSAndroid Build Coastguard Worker } 295*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 # Generate *once*, use throughout. 296*6dbdd20aSAndroid Build Coastguard Worker} 297*6dbdd20aSAndroid Build Coastguard Workerpacket { 298*6dbdd20aSAndroid Build Coastguard Worker timestamp: 250 299*6dbdd20aSAndroid Build Coastguard Worker track_event { 300*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_END 301*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 60000 302*6dbdd20aSAndroid Build Coastguard Worker } 303*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 304*6dbdd20aSAndroid Build Coastguard Worker} 305*6dbdd20aSAndroid Build Coastguard Worker 306*6dbdd20aSAndroid Build Coastguard Worker# The events for the Child A2 track. 307*6dbdd20aSAndroid Build Coastguard Workerpacket { 308*6dbdd20aSAndroid Build Coastguard Worker timestamp: 220 309*6dbdd20aSAndroid Build Coastguard Worker track_event { 310*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_BEGIN 311*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 60001 # Same random number from above. 312*6dbdd20aSAndroid Build Coastguard Worker name: "A2" 313*6dbdd20aSAndroid Build Coastguard Worker } 314*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 # Generate *once*, use throughout. 315*6dbdd20aSAndroid Build Coastguard Worker} 316*6dbdd20aSAndroid Build Coastguard Workerpacket { 317*6dbdd20aSAndroid Build Coastguard Worker timestamp: 240 318*6dbdd20aSAndroid Build Coastguard Worker track_event { 319*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_END 320*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 60001 321*6dbdd20aSAndroid Build Coastguard Worker } 322*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 323*6dbdd20aSAndroid Build Coastguard Worker} 324*6dbdd20aSAndroid Build Coastguard Worker 325*6dbdd20aSAndroid Build Coastguard Worker# The events for the Child B1 track. 326*6dbdd20aSAndroid Build Coastguard Workerpacket { 327*6dbdd20aSAndroid Build Coastguard Worker timestamp: 210 328*6dbdd20aSAndroid Build Coastguard Worker track_event { 329*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_BEGIN 330*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 70000 # Same random number from above. 331*6dbdd20aSAndroid Build Coastguard Worker name: "B1" 332*6dbdd20aSAndroid Build Coastguard Worker } 333*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 # Generate *once*, use throughout. 334*6dbdd20aSAndroid Build Coastguard Worker} 335*6dbdd20aSAndroid Build Coastguard Workerpacket { 336*6dbdd20aSAndroid Build Coastguard Worker timestamp: 230 337*6dbdd20aSAndroid Build Coastguard Worker track_event { 338*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_END 339*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 70000 340*6dbdd20aSAndroid Build Coastguard Worker } 341*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 342*6dbdd20aSAndroid Build Coastguard Worker} 343*6dbdd20aSAndroid Build Coastguard Worker``` 344*6dbdd20aSAndroid Build Coastguard Worker 345*6dbdd20aSAndroid Build Coastguard Worker## Track sorting order 346*6dbdd20aSAndroid Build Coastguard Worker 347*6dbdd20aSAndroid Build Coastguard WorkerNOTE: the closest equivalent to this in the JSON format is `process_sort_index` 348*6dbdd20aSAndroid Build Coastguard Workerbut the Perfetto approach is significantly more flexible. 349*6dbdd20aSAndroid Build Coastguard Worker 350*6dbdd20aSAndroid Build Coastguard WorkerPerfetto also supports specifying of how the tracks should be visualized in the 351*6dbdd20aSAndroid Build Coastguard WorkerUI by default. This is done via the use of the `child_ordering` field which can 352*6dbdd20aSAndroid Build Coastguard Workerbe set on `TrackDescriptor`. 353*6dbdd20aSAndroid Build Coastguard Worker 354*6dbdd20aSAndroid Build Coastguard WorkerFor example, to sort the tracks lexicographically (i.e. in alphabetical order): 355*6dbdd20aSAndroid Build Coastguard Worker 356*6dbdd20aSAndroid Build Coastguard Worker``` 357*6dbdd20aSAndroid Build Coastguard Workerpacket { 358*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 359*6dbdd20aSAndroid Build Coastguard Worker uuid: 10 360*6dbdd20aSAndroid Build Coastguard Worker name: "Root" 361*6dbdd20aSAndroid Build Coastguard Worker # Any children of the `Root` track will appear in alphabetical order. This 362*6dbdd20aSAndroid Build Coastguard Worker # does *not* propogate to any indirect descendants, just the direct 363*6dbdd20aSAndroid Build Coastguard Worker # children. 364*6dbdd20aSAndroid Build Coastguard Worker child_ordering: LEXICOGRAPHIC 365*6dbdd20aSAndroid Build Coastguard Worker } 366*6dbdd20aSAndroid Build Coastguard Worker} 367*6dbdd20aSAndroid Build Coastguard Worker# B will appear nested under `Root` but *after* `A` in the UI, even though it 368*6dbdd20aSAndroid Build Coastguard Worker# appears first in the trace and has a smaller UUID. 369*6dbdd20aSAndroid Build Coastguard Workerpacket { 370*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 371*6dbdd20aSAndroid Build Coastguard Worker uuid: 11 372*6dbdd20aSAndroid Build Coastguard Worker parent_uuid: 10 373*6dbdd20aSAndroid Build Coastguard Worker name: "B" 374*6dbdd20aSAndroid Build Coastguard Worker } 375*6dbdd20aSAndroid Build Coastguard Worker} 376*6dbdd20aSAndroid Build Coastguard Workerpacket { 377*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 378*6dbdd20aSAndroid Build Coastguard Worker uuid: 12 379*6dbdd20aSAndroid Build Coastguard Worker parent_uuid: 10 380*6dbdd20aSAndroid Build Coastguard Worker name: "A" 381*6dbdd20aSAndroid Build Coastguard Worker } 382*6dbdd20aSAndroid Build Coastguard Worker} 383*6dbdd20aSAndroid Build Coastguard Worker``` 384*6dbdd20aSAndroid Build Coastguard Worker 385*6dbdd20aSAndroid Build Coastguard WorkerChronological order is also supported, this sorts the tracks with the earliest 386*6dbdd20aSAndroid Build Coastguard Workerevent first: 387*6dbdd20aSAndroid Build Coastguard Worker 388*6dbdd20aSAndroid Build Coastguard Worker``` 389*6dbdd20aSAndroid Build Coastguard Workerpacket { 390*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 391*6dbdd20aSAndroid Build Coastguard Worker uuid: 10 392*6dbdd20aSAndroid Build Coastguard Worker name: "Root" 393*6dbdd20aSAndroid Build Coastguard Worker # Any children of the `Root` track will appear in the order based on the 394*6dbdd20aSAndroid Build Coastguard Worker # timestamp of the first event on the trace: earlier timestamps will appear 395*6dbdd20aSAndroid Build Coastguard Worker # higher in the trace. This does *not* propogate to any indirect 396*6dbdd20aSAndroid Build Coastguard Worker # descendants, just the direct children. 397*6dbdd20aSAndroid Build Coastguard Worker child_ordering: CHRONOLOGICAL 398*6dbdd20aSAndroid Build Coastguard Worker } 399*6dbdd20aSAndroid Build Coastguard Worker} 400*6dbdd20aSAndroid Build Coastguard Worker 401*6dbdd20aSAndroid Build Coastguard Worker# B will appear before A because B's first slice starts earlier than A's first 402*6dbdd20aSAndroid Build Coastguard Worker# slice. 403*6dbdd20aSAndroid Build Coastguard Workerpacket { 404*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 405*6dbdd20aSAndroid Build Coastguard Worker uuid: 11 406*6dbdd20aSAndroid Build Coastguard Worker parent_uuid: 10 407*6dbdd20aSAndroid Build Coastguard Worker name: "A" 408*6dbdd20aSAndroid Build Coastguard Worker } 409*6dbdd20aSAndroid Build Coastguard Worker} 410*6dbdd20aSAndroid Build Coastguard Workerpacket { 411*6dbdd20aSAndroid Build Coastguard Worker timestamp: 220 412*6dbdd20aSAndroid Build Coastguard Worker track_event { 413*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_BEGIN 414*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 11 415*6dbdd20aSAndroid Build Coastguard Worker name: "A1" 416*6dbdd20aSAndroid Build Coastguard Worker } 417*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 418*6dbdd20aSAndroid Build Coastguard Worker} 419*6dbdd20aSAndroid Build Coastguard Workerpacket { 420*6dbdd20aSAndroid Build Coastguard Worker timestamp: 230 421*6dbdd20aSAndroid Build Coastguard Worker track_event { 422*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_END 423*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 60000 424*6dbdd20aSAndroid Build Coastguard Worker } 425*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 426*6dbdd20aSAndroid Build Coastguard Worker} 427*6dbdd20aSAndroid Build Coastguard Worker 428*6dbdd20aSAndroid Build Coastguard Workerpacket { 429*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 430*6dbdd20aSAndroid Build Coastguard Worker uuid: 12 431*6dbdd20aSAndroid Build Coastguard Worker parent_uuid: 10 432*6dbdd20aSAndroid Build Coastguard Worker name: "B" 433*6dbdd20aSAndroid Build Coastguard Worker } 434*6dbdd20aSAndroid Build Coastguard Worker} 435*6dbdd20aSAndroid Build Coastguard Workerpacket { 436*6dbdd20aSAndroid Build Coastguard Worker timestamp: 210 437*6dbdd20aSAndroid Build Coastguard Worker track_event { 438*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_BEGIN 439*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 12 440*6dbdd20aSAndroid Build Coastguard Worker name: "B1" 441*6dbdd20aSAndroid Build Coastguard Worker } 442*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 443*6dbdd20aSAndroid Build Coastguard Worker} 444*6dbdd20aSAndroid Build Coastguard Workerpacket { 445*6dbdd20aSAndroid Build Coastguard Worker timestamp: 240 446*6dbdd20aSAndroid Build Coastguard Worker track_event { 447*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_END 448*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 12 449*6dbdd20aSAndroid Build Coastguard Worker } 450*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 451*6dbdd20aSAndroid Build Coastguard Worker} 452*6dbdd20aSAndroid Build Coastguard Worker``` 453*6dbdd20aSAndroid Build Coastguard Worker 454*6dbdd20aSAndroid Build Coastguard WorkerFinally, for exact control, you can use the `EXPLICIT` ordering and specify 455*6dbdd20aSAndroid Build Coastguard Worker`sibling_order_rank` on each child track: 456*6dbdd20aSAndroid Build Coastguard Worker 457*6dbdd20aSAndroid Build Coastguard Worker``` 458*6dbdd20aSAndroid Build Coastguard Workerpacket { 459*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 460*6dbdd20aSAndroid Build Coastguard Worker uuid: 10 461*6dbdd20aSAndroid Build Coastguard Worker name: "Root" 462*6dbdd20aSAndroid Build Coastguard Worker # Any children of the `Root` track will appear in order specified by 463*6dbdd20aSAndroid Build Coastguard Worker # `sibling_order_rank` exactly: any unspecified rank is treated as 0 464*6dbdd20aSAndroid Build Coastguard Worker # implicitly. 465*6dbdd20aSAndroid Build Coastguard Worker child_ordering: EXPLICIT 466*6dbdd20aSAndroid Build Coastguard Worker } 467*6dbdd20aSAndroid Build Coastguard Worker} 468*6dbdd20aSAndroid Build Coastguard Worker# C will appear first, then B then A following the order specified by 469*6dbdd20aSAndroid Build Coastguard Worker# `sibling_order_rank`. 470*6dbdd20aSAndroid Build Coastguard Workerpacket { 471*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 472*6dbdd20aSAndroid Build Coastguard Worker uuid: 11 473*6dbdd20aSAndroid Build Coastguard Worker parent_uuid: 10 474*6dbdd20aSAndroid Build Coastguard Worker name: "B" 475*6dbdd20aSAndroid Build Coastguard Worker sibling_order_rank: 1 476*6dbdd20aSAndroid Build Coastguard Worker } 477*6dbdd20aSAndroid Build Coastguard Worker} 478*6dbdd20aSAndroid Build Coastguard Workerpacket { 479*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 480*6dbdd20aSAndroid Build Coastguard Worker uuid: 12 481*6dbdd20aSAndroid Build Coastguard Worker parent_uuid: 10 482*6dbdd20aSAndroid Build Coastguard Worker name: "A" 483*6dbdd20aSAndroid Build Coastguard Worker sibling_order_rank: 100 484*6dbdd20aSAndroid Build Coastguard Worker } 485*6dbdd20aSAndroid Build Coastguard Worker} 486*6dbdd20aSAndroid Build Coastguard Workerpacket { 487*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 488*6dbdd20aSAndroid Build Coastguard Worker uuid: 13 489*6dbdd20aSAndroid Build Coastguard Worker parent_uuid: 10 490*6dbdd20aSAndroid Build Coastguard Worker name: "C" 491*6dbdd20aSAndroid Build Coastguard Worker sibling_order_rank: -100 492*6dbdd20aSAndroid Build Coastguard Worker } 493*6dbdd20aSAndroid Build Coastguard Worker} 494*6dbdd20aSAndroid Build Coastguard Worker``` 495*6dbdd20aSAndroid Build Coastguard Worker 496*6dbdd20aSAndroid Build Coastguard WorkerNOTE: using `EXPLICIT` is strongly discouraged where there is another option. 497*6dbdd20aSAndroid Build Coastguard WorkerOther orders are significantly more efficient and also allows for trace 498*6dbdd20aSAndroid Build Coastguard Workerprocessor and the UI to better understand what you want to do with those tracks. 499*6dbdd20aSAndroid Build Coastguard WorkerMoreover, it gives the flexibility for having custom visualization (e.g. Gannt 500*6dbdd20aSAndroid Build Coastguard Workercharts for CHRONOLOGICAL view) based on the type specified. 501*6dbdd20aSAndroid Build Coastguard Worker 502*6dbdd20aSAndroid Build Coastguard WorkerFurther documentation about the sorting order is available on the protos for 503*6dbdd20aSAndroid Build Coastguard Worker[TrackDescriptor](/docs/reference/trace-packet-proto.autogen#TrackDescriptor) 504*6dbdd20aSAndroid Build Coastguard Workerand 505*6dbdd20aSAndroid Build Coastguard Worker[ChildTracksOrdering](/docs/reference/trace-packet-proto.autogen#TrackDescriptor.ChildTracksOrdering). 506*6dbdd20aSAndroid Build Coastguard Worker 507*6dbdd20aSAndroid Build Coastguard WorkerNOTE: the order specified in the trace is a treated as a hint in the UI not a 508*6dbdd20aSAndroid Build Coastguard Workergurantee. The UI reserves the right to change the ordering as it sees fit. 509*6dbdd20aSAndroid Build Coastguard Worker 510*6dbdd20aSAndroid Build Coastguard Worker## Flows 511*6dbdd20aSAndroid Build Coastguard Worker 512*6dbdd20aSAndroid Build Coastguard WorkerNOTE: in the legacy JSON tracing format, this section correspond to s/t/f 513*6dbdd20aSAndroid Build Coastguard Workerevents. 514*6dbdd20aSAndroid Build Coastguard Worker 515*6dbdd20aSAndroid Build Coastguard WorkerFlows allow connecting any number of slices with arrows. The semantic meaning of 516*6dbdd20aSAndroid Build Coastguard Workerthe arrow varies across different applications but most commonly it is used to 517*6dbdd20aSAndroid Build Coastguard Workertrack work passing between threads or processes: e.g. the UI thread asks a 518*6dbdd20aSAndroid Build Coastguard Workerbackground thread to do some work and notify when the result is available. 519*6dbdd20aSAndroid Build Coastguard Worker 520*6dbdd20aSAndroid Build Coastguard WorkerNOTE: a single flow _cannot_ fork ands imply represents a single stream of 521*6dbdd20aSAndroid Build Coastguard Workerarrows from one slice to the next. See 522*6dbdd20aSAndroid Build Coastguard Worker[this](https://source.chromium.org/chromium/chromium/src/+/main:third_party/perfetto/protos/perfetto/trace/perfetto_trace.proto;drc=ba05b783d9c29fe334a02913cf157ea1d415d37c;l=9604) 523*6dbdd20aSAndroid Build Coastguard Workercomment for information. 524*6dbdd20aSAndroid Build Coastguard Worker 525*6dbdd20aSAndroid Build Coastguard Worker 526*6dbdd20aSAndroid Build Coastguard Worker 527*6dbdd20aSAndroid Build Coastguard Worker``` 528*6dbdd20aSAndroid Build Coastguard Worker# The main thread of the process. 529*6dbdd20aSAndroid Build Coastguard Workerpacket { 530*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 531*6dbdd20aSAndroid Build Coastguard Worker uuid: 93094 532*6dbdd20aSAndroid Build Coastguard Worker thread { 533*6dbdd20aSAndroid Build Coastguard Worker pid: 100 534*6dbdd20aSAndroid Build Coastguard Worker tid: 100 535*6dbdd20aSAndroid Build Coastguard Worker thread_name: "Main thread" 536*6dbdd20aSAndroid Build Coastguard Worker } 537*6dbdd20aSAndroid Build Coastguard Worker } 538*6dbdd20aSAndroid Build Coastguard Worker} 539*6dbdd20aSAndroid Build Coastguard Workerpacket { 540*6dbdd20aSAndroid Build Coastguard Worker timestamp: 200 541*6dbdd20aSAndroid Build Coastguard Worker track_event { 542*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_BEGIN 543*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 93094 544*6dbdd20aSAndroid Build Coastguard Worker name: "Request generation" 545*6dbdd20aSAndroid Build Coastguard Worker flow_ids: 1055895987 # Random number used to track work 546*6dbdd20aSAndroid Build Coastguard Worker # across threads/processes. 547*6dbdd20aSAndroid Build Coastguard Worker } 548*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 549*6dbdd20aSAndroid Build Coastguard Worker} 550*6dbdd20aSAndroid Build Coastguard Workerpacket { 551*6dbdd20aSAndroid Build Coastguard Worker timestamp: 300 552*6dbdd20aSAndroid Build Coastguard Worker track_event { 553*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_END 554*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 93094 555*6dbdd20aSAndroid Build Coastguard Worker } 556*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 557*6dbdd20aSAndroid Build Coastguard Worker} 558*6dbdd20aSAndroid Build Coastguard Workerpacket { 559*6dbdd20aSAndroid Build Coastguard Worker timestamp: 400 560*6dbdd20aSAndroid Build Coastguard Worker track_event { 561*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_BEGIN 562*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 93094 563*6dbdd20aSAndroid Build Coastguard Worker name: "Process background result" 564*6dbdd20aSAndroid Build Coastguard Worker flow_ids: 1055895987 # Same as above. 565*6dbdd20aSAndroid Build Coastguard Worker } 566*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 567*6dbdd20aSAndroid Build Coastguard Worker} 568*6dbdd20aSAndroid Build Coastguard Workerpacket { 569*6dbdd20aSAndroid Build Coastguard Worker timestamp: 500 570*6dbdd20aSAndroid Build Coastguard Worker track_event { 571*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_END 572*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 93094 573*6dbdd20aSAndroid Build Coastguard Worker } 574*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 575*6dbdd20aSAndroid Build Coastguard Worker} 576*6dbdd20aSAndroid Build Coastguard Worker 577*6dbdd20aSAndroid Build Coastguard Worker# The background thread of the process. 578*6dbdd20aSAndroid Build Coastguard Workerpacket { 579*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 580*6dbdd20aSAndroid Build Coastguard Worker uuid: 40489498 581*6dbdd20aSAndroid Build Coastguard Worker thread { 582*6dbdd20aSAndroid Build Coastguard Worker pid: 100 583*6dbdd20aSAndroid Build Coastguard Worker tid: 101 584*6dbdd20aSAndroid Build Coastguard Worker thread_name: "Background thread" 585*6dbdd20aSAndroid Build Coastguard Worker } 586*6dbdd20aSAndroid Build Coastguard Worker } 587*6dbdd20aSAndroid Build Coastguard Worker} 588*6dbdd20aSAndroid Build Coastguard Workerpacket { 589*6dbdd20aSAndroid Build Coastguard Worker timestamp: 310 590*6dbdd20aSAndroid Build Coastguard Worker track_event { 591*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_BEGIN 592*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 40489498 593*6dbdd20aSAndroid Build Coastguard Worker name: "Background work" 594*6dbdd20aSAndroid Build Coastguard Worker flow_ids: 1055895987 # Same as above. 595*6dbdd20aSAndroid Build Coastguard Worker } 596*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 597*6dbdd20aSAndroid Build Coastguard Worker} 598*6dbdd20aSAndroid Build Coastguard Workerpacket { 599*6dbdd20aSAndroid Build Coastguard Worker timestamp: 385 600*6dbdd20aSAndroid Build Coastguard Worker track_event { 601*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_END 602*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 40489498 603*6dbdd20aSAndroid Build Coastguard Worker } 604*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 605*6dbdd20aSAndroid Build Coastguard Worker} 606*6dbdd20aSAndroid Build Coastguard Worker``` 607*6dbdd20aSAndroid Build Coastguard Worker 608*6dbdd20aSAndroid Build Coastguard Worker## Counters 609*6dbdd20aSAndroid Build Coastguard Worker 610*6dbdd20aSAndroid Build Coastguard WorkerNOTE: in the legacy JSON tracing format, this section correspond to C events. 611*6dbdd20aSAndroid Build Coastguard Worker 612*6dbdd20aSAndroid Build Coastguard WorkerCounters are useful to represent continuous values which change with time. 613*6dbdd20aSAndroid Build Coastguard WorkerCommon examples include CPU frequency, memory usage, battery charge etc. 614*6dbdd20aSAndroid Build Coastguard Worker 615*6dbdd20aSAndroid Build Coastguard Worker 616*6dbdd20aSAndroid Build Coastguard Worker 617*6dbdd20aSAndroid Build Coastguard WorkerThis corresponds to the following protos: 618*6dbdd20aSAndroid Build Coastguard Worker 619*6dbdd20aSAndroid Build Coastguard Worker``` 620*6dbdd20aSAndroid Build Coastguard Worker# Counter track scoped to a process. 621*6dbdd20aSAndroid Build Coastguard Workerpacket { 622*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 623*6dbdd20aSAndroid Build Coastguard Worker uuid: 1388 624*6dbdd20aSAndroid Build Coastguard Worker process { 625*6dbdd20aSAndroid Build Coastguard Worker pid: 1024 626*6dbdd20aSAndroid Build Coastguard Worker process_name: "MySpecialProcess" 627*6dbdd20aSAndroid Build Coastguard Worker } 628*6dbdd20aSAndroid Build Coastguard Worker } 629*6dbdd20aSAndroid Build Coastguard Worker} 630*6dbdd20aSAndroid Build Coastguard Workerpacket { 631*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 632*6dbdd20aSAndroid Build Coastguard Worker uuid: 4489498 633*6dbdd20aSAndroid Build Coastguard Worker parent_uuid: 1388 634*6dbdd20aSAndroid Build Coastguard Worker name: "My special counter" 635*6dbdd20aSAndroid Build Coastguard Worker counter {} 636*6dbdd20aSAndroid Build Coastguard Worker } 637*6dbdd20aSAndroid Build Coastguard Worker} 638*6dbdd20aSAndroid Build Coastguard Workerpacket { 639*6dbdd20aSAndroid Build Coastguard Worker timestamp: 200 640*6dbdd20aSAndroid Build Coastguard Worker track_event { 641*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_COUNTER 642*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 4489498 643*6dbdd20aSAndroid Build Coastguard Worker counter_value: 34567 # Value at start 644*6dbdd20aSAndroid Build Coastguard Worker } 645*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 646*6dbdd20aSAndroid Build Coastguard Worker} 647*6dbdd20aSAndroid Build Coastguard Workerpacket { 648*6dbdd20aSAndroid Build Coastguard Worker timestamp: 250 649*6dbdd20aSAndroid Build Coastguard Worker track_event { 650*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_COUNTER 651*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 4489498 652*6dbdd20aSAndroid Build Coastguard Worker counter_value: 67890 # Value goes up 653*6dbdd20aSAndroid Build Coastguard Worker } 654*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 655*6dbdd20aSAndroid Build Coastguard Worker} 656*6dbdd20aSAndroid Build Coastguard Workerpacket { 657*6dbdd20aSAndroid Build Coastguard Worker timestamp: 300 658*6dbdd20aSAndroid Build Coastguard Worker track_event { 659*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_COUNTER 660*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 4489498 661*6dbdd20aSAndroid Build Coastguard Worker counter_value: 12345 # Value goes down 662*6dbdd20aSAndroid Build Coastguard Worker } 663*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 664*6dbdd20aSAndroid Build Coastguard Worker} 665*6dbdd20aSAndroid Build Coastguard Workerpacket { 666*6dbdd20aSAndroid Build Coastguard Worker timestamp: 400 667*6dbdd20aSAndroid Build Coastguard Worker track_event { 668*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_COUNTER 669*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 4489498 670*6dbdd20aSAndroid Build Coastguard Worker counter_value: 12345 # Final value 671*6dbdd20aSAndroid Build Coastguard Worker } 672*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 673*6dbdd20aSAndroid Build Coastguard Worker} 674*6dbdd20aSAndroid Build Coastguard Worker``` 675*6dbdd20aSAndroid Build Coastguard Worker 676*6dbdd20aSAndroid Build Coastguard Worker## Interning 677*6dbdd20aSAndroid Build Coastguard Worker 678*6dbdd20aSAndroid Build Coastguard WorkerNOTE: there is no equivalent to interning in the JSON tracing format. 679*6dbdd20aSAndroid Build Coastguard Worker 680*6dbdd20aSAndroid Build Coastguard WorkerInterning is an advanced but powerful feature of the protobuf tracing format 681*6dbdd20aSAndroid Build Coastguard Workerwhich allows allows for reducing the number of times long strings are emitted in 682*6dbdd20aSAndroid Build Coastguard Workerthe trace. 683*6dbdd20aSAndroid Build Coastguard Worker 684*6dbdd20aSAndroid Build Coastguard WorkerSpecifically, certain fields in the protobuf format allow associating an "iid" 685*6dbdd20aSAndroid Build Coastguard Worker(interned id) to a string and using the iid to reference the string in all 686*6dbdd20aSAndroid Build Coastguard Workerfuture packets. The most commonly used cases are slice names and category names 687*6dbdd20aSAndroid Build Coastguard Worker 688*6dbdd20aSAndroid Build Coastguard WorkerHere is an example of a trace which makes use of interning to reduce the number 689*6dbdd20aSAndroid Build Coastguard Workerof times a very long slice name is emitted: 690*6dbdd20aSAndroid Build Coastguard Worker 691*6dbdd20aSAndroid Build Coastguard Worker 692*6dbdd20aSAndroid Build Coastguard WorkerThis corresponds to the following protos: 693*6dbdd20aSAndroid Build Coastguard Worker 694*6dbdd20aSAndroid Build Coastguard Worker``` 695*6dbdd20aSAndroid Build Coastguard Workerpacket { 696*6dbdd20aSAndroid Build Coastguard Worker track_descriptor { 697*6dbdd20aSAndroid Build Coastguard Worker uuid: 48948 # 64-bit random number. 698*6dbdd20aSAndroid Build Coastguard Worker name: "My special track" 699*6dbdd20aSAndroid Build Coastguard Worker process { 700*6dbdd20aSAndroid Build Coastguard Worker pid: 1234 # PID for your process 701*6dbdd20aSAndroid Build Coastguard Worker process_name: "My process name" 702*6dbdd20aSAndroid Build Coastguard Worker } 703*6dbdd20aSAndroid Build Coastguard Worker } 704*6dbdd20aSAndroid Build Coastguard Worker} 705*6dbdd20aSAndroid Build Coastguard Workerpacket { 706*6dbdd20aSAndroid Build Coastguard Worker timestamp: 200 707*6dbdd20aSAndroid Build Coastguard Worker track_event { 708*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_BEGIN 709*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 48948 # Same random number from above. 710*6dbdd20aSAndroid Build Coastguard Worker name_iid: 1 # References the string in interned_data 711*6dbdd20aSAndroid Build Coastguard Worker # (see below) 712*6dbdd20aSAndroid Build Coastguard Worker } 713*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 # Generate *once*, use throughout. 714*6dbdd20aSAndroid Build Coastguard Worker 715*6dbdd20aSAndroid Build Coastguard Worker interned_data { 716*6dbdd20aSAndroid Build Coastguard Worker # Creates a mapping from the iid "1" to the string name: any |name_iid| field 717*6dbdd20aSAndroid Build Coastguard Worker # in this packet onwards will transparently be remapped to this string by trace 718*6dbdd20aSAndroid Build Coastguard Worker # processor. 719*6dbdd20aSAndroid Build Coastguard Worker # Note: iid 0 is *not* a valid IID and should not be used. 720*6dbdd20aSAndroid Build Coastguard Worker event_names { 721*6dbdd20aSAndroid Build Coastguard Worker iid: 1 722*6dbdd20aSAndroid Build Coastguard Worker name: "A very very very long slice name which we don't want to repeat" 723*6dbdd20aSAndroid Build Coastguard Worker } 724*6dbdd20aSAndroid Build Coastguard Worker } 725*6dbdd20aSAndroid Build Coastguard Worker 726*6dbdd20aSAndroid Build Coastguard Worker first_packet_on_sequence: true # Indicates to trace processor that 727*6dbdd20aSAndroid Build Coastguard Worker # this is the first packet on the 728*6dbdd20aSAndroid Build Coastguard Worker # sequence. 729*6dbdd20aSAndroid Build Coastguard Worker previous_packet_dropped: true # Same as |first_packet_on_sequence|. 730*6dbdd20aSAndroid Build Coastguard Worker 731*6dbdd20aSAndroid Build Coastguard Worker # Indicates to trace processor that this sequence resets the incremental state but 732*6dbdd20aSAndroid Build Coastguard Worker # also depends on incrtemental state state. 733*6dbdd20aSAndroid Build Coastguard Worker # 3 = SEQ_INCREMENTAL_STATE_CLEARED | SEQ_NEEDS_INCREMENTAL_STATE 734*6dbdd20aSAndroid Build Coastguard Worker sequence_flags: 3 735*6dbdd20aSAndroid Build Coastguard Worker} 736*6dbdd20aSAndroid Build Coastguard Workerpacket { 737*6dbdd20aSAndroid Build Coastguard Worker timestamp: 201 738*6dbdd20aSAndroid Build Coastguard Worker track_event { 739*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_END 740*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 48948 741*6dbdd20aSAndroid Build Coastguard Worker } 742*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 743*6dbdd20aSAndroid Build Coastguard Worker} 744*6dbdd20aSAndroid Build Coastguard Workerpacket { 745*6dbdd20aSAndroid Build Coastguard Worker timestamp: 202 746*6dbdd20aSAndroid Build Coastguard Worker track_event { 747*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_BEGIN 748*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 48948 # Same random number from above. 749*6dbdd20aSAndroid Build Coastguard Worker name_iid: 1 # References the string in interned_data 750*6dbdd20aSAndroid Build Coastguard Worker # above. 751*6dbdd20aSAndroid Build Coastguard Worker } 752*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 # Generate *once*, use throughout. 753*6dbdd20aSAndroid Build Coastguard Worker # 2 = SEQ_NEEDS_INCREMENTAL_STATE 754*6dbdd20aSAndroid Build Coastguard Worker sequence_flags: 2 755*6dbdd20aSAndroid Build Coastguard Worker} 756*6dbdd20aSAndroid Build Coastguard Workerpacket { 757*6dbdd20aSAndroid Build Coastguard Worker timestamp: 203 758*6dbdd20aSAndroid Build Coastguard Worker track_event { 759*6dbdd20aSAndroid Build Coastguard Worker type: TYPE_SLICE_END 760*6dbdd20aSAndroid Build Coastguard Worker track_uuid: 48948 761*6dbdd20aSAndroid Build Coastguard Worker } 762*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id: 3903809 763*6dbdd20aSAndroid Build Coastguard Worker} 764*6dbdd20aSAndroid Build Coastguard Worker``` 765