xref: /aosp_15_r20/external/perfetto/docs/data-sources/frametimeline.md (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker# Android Jank detection with FrameTimeline
2*6dbdd20aSAndroid Build Coastguard Worker
3*6dbdd20aSAndroid Build Coastguard WorkerNOTE: **FrameTimeline requires Android 12(S) or higher**
4*6dbdd20aSAndroid Build Coastguard Worker
5*6dbdd20aSAndroid Build Coastguard WorkerA frame is said to be janky if the time the frame was presented on screen does
6*6dbdd20aSAndroid Build Coastguard Workernot match the predicted present time given by the scheduler.
7*6dbdd20aSAndroid Build Coastguard Worker
8*6dbdd20aSAndroid Build Coastguard WorkerA jank can cause:
9*6dbdd20aSAndroid Build Coastguard Worker* Unstable frame rate
10*6dbdd20aSAndroid Build Coastguard Worker* Increased latency
11*6dbdd20aSAndroid Build Coastguard Worker
12*6dbdd20aSAndroid Build Coastguard WorkerFrameTimeline is a module within SurfaceFlinger that detects janks and reports
13*6dbdd20aSAndroid Build Coastguard Workerthe source of the jank.
14*6dbdd20aSAndroid Build Coastguard Worker[SurfaceViews](https://developer.android.com/reference/android/view/SurfaceView)
15*6dbdd20aSAndroid Build Coastguard Workerare currently **not supported**, but will be, in future.
16*6dbdd20aSAndroid Build Coastguard Worker
17*6dbdd20aSAndroid Build Coastguard Worker## UI
18*6dbdd20aSAndroid Build Coastguard Worker
19*6dbdd20aSAndroid Build Coastguard WorkerTwo new tracks are added for every application that had at least one frame on
20*6dbdd20aSAndroid Build Coastguard Workerscreen.
21*6dbdd20aSAndroid Build Coastguard Worker
22*6dbdd20aSAndroid Build Coastguard Worker![](/docs/images/frametimeline/timeline_tracks.png)
23*6dbdd20aSAndroid Build Coastguard Worker
24*6dbdd20aSAndroid Build Coastguard Worker* Expected Timeline
25*6dbdd20aSAndroid Build Coastguard WorkerEach slice represents the time given to the app for rendering the
26*6dbdd20aSAndroid Build Coastguard Workerframe. To avoid janks in the system, the app is expected to finish within this
27*6dbdd20aSAndroid Build Coastguard Workertime frame. The start time is the time the Choreographer callback was scheduled to run.
28*6dbdd20aSAndroid Build Coastguard Worker
29*6dbdd20aSAndroid Build Coastguard Worker* Actual Timeline
30*6dbdd20aSAndroid Build Coastguard WorkerThese slices represent the actual time an app took to complete the frame
31*6dbdd20aSAndroid Build Coastguard Worker(including GPU work) and send it to SurfaceFlinger for composition. The start time
32*6dbdd20aSAndroid Build Coastguard Workeris the time that `Choreographer#doFrame` or `AChoreographer_vsyncCallback` started to run.
33*6dbdd20aSAndroid Build Coastguard WorkerThe end time of the slices here represent `max(gpu time,
34*6dbdd20aSAndroid Build Coastguard Workerpost time)`. **Post time** is the time the app's frame was posted to
35*6dbdd20aSAndroid Build Coastguard WorkerSurfaceFlinger.
36*6dbdd20aSAndroid Build Coastguard Worker
37*6dbdd20aSAndroid Build Coastguard Worker![](/docs/images/frametimeline/app-timelines.png)
38*6dbdd20aSAndroid Build Coastguard Worker
39*6dbdd20aSAndroid Build Coastguard WorkerSimilarly, SurfaceFlinger also gets these two new tracks representing the
40*6dbdd20aSAndroid Build Coastguard Workerexpected time it's supposed to finish within, and the actual time it took to
41*6dbdd20aSAndroid Build Coastguard Workerfinish compositing frames and presenting on-screen. Here, SurfaceFlinger's work
42*6dbdd20aSAndroid Build Coastguard Workerrepresents everything underneath it in the display stack. This includes the
43*6dbdd20aSAndroid Build Coastguard WorkerComposer and the DisplayHAL. So, the slices represent SurfaceFlinger main
44*6dbdd20aSAndroid Build Coastguard Workerthread's start to on-screen update.
45*6dbdd20aSAndroid Build Coastguard Worker
46*6dbdd20aSAndroid Build Coastguard WorkerThe names of the slices represent the token received from
47*6dbdd20aSAndroid Build Coastguard Worker[choreographer](https://developer.android.com/reference/android/view/Choreographer).
48*6dbdd20aSAndroid Build Coastguard WorkerYou can compare a slice in the actual timeline track to its corresponding slice
49*6dbdd20aSAndroid Build Coastguard Workerin the expected timeline track to see how the app performed compared to the
50*6dbdd20aSAndroid Build Coastguard Workerexpectations. In addition, for debugging purposes, the token is added to the
51*6dbdd20aSAndroid Build Coastguard Workerapp's **doFrame** and **RenderThread** slices. For SurfaceFlinger, the same
52*6dbdd20aSAndroid Build Coastguard Workertoken is shown in **onMessageReceived**.
53*6dbdd20aSAndroid Build Coastguard Worker
54*6dbdd20aSAndroid Build Coastguard Worker![](/docs/images/frametimeline/app-vsyncid.png)
55*6dbdd20aSAndroid Build Coastguard Worker
56*6dbdd20aSAndroid Build Coastguard Worker![](/docs/images/frametimeline/sf-vsyncid.png)
57*6dbdd20aSAndroid Build Coastguard Worker
58*6dbdd20aSAndroid Build Coastguard Worker### Selecting an actual timeline slice
59*6dbdd20aSAndroid Build Coastguard Worker
60*6dbdd20aSAndroid Build Coastguard Worker![](/docs/images/frametimeline/selection.png)
61*6dbdd20aSAndroid Build Coastguard Worker
62*6dbdd20aSAndroid Build Coastguard WorkerThe selection details provide more information on what happened with the frame.
63*6dbdd20aSAndroid Build Coastguard WorkerThese include:
64*6dbdd20aSAndroid Build Coastguard Worker
65*6dbdd20aSAndroid Build Coastguard Worker* **Present Type**
66*6dbdd20aSAndroid Build Coastguard Worker
67*6dbdd20aSAndroid Build Coastguard WorkerWas the frame early, on time or late.
68*6dbdd20aSAndroid Build Coastguard Worker* **On time finish**
69*6dbdd20aSAndroid Build Coastguard Worker
70*6dbdd20aSAndroid Build Coastguard WorkerDid the application finish its work for the frame on time?
71*6dbdd20aSAndroid Build Coastguard Worker* **Jank Type**
72*6dbdd20aSAndroid Build Coastguard Worker
73*6dbdd20aSAndroid Build Coastguard WorkerWas there a jank observed with this frame? If yes, this shows what type of jank
74*6dbdd20aSAndroid Build Coastguard Workerwas observed. If not, the type would be **None**.
75*6dbdd20aSAndroid Build Coastguard Worker* **Prediction type**
76*6dbdd20aSAndroid Build Coastguard Worker
77*6dbdd20aSAndroid Build Coastguard WorkerDid the prediction expire by the time this frame was received by FrameTimeline?
78*6dbdd20aSAndroid Build Coastguard WorkerIf yes, this will say **Expired Prediction**. If not, **Valid Prediction**.
79*6dbdd20aSAndroid Build Coastguard Worker* **GPU Composition**
80*6dbdd20aSAndroid Build Coastguard Worker
81*6dbdd20aSAndroid Build Coastguard WorkerBoolean that tells if the frame was composited by the GPU or not.
82*6dbdd20aSAndroid Build Coastguard Worker* **Layer Name**
83*6dbdd20aSAndroid Build Coastguard Worker
84*6dbdd20aSAndroid Build Coastguard WorkerName of the Layer/Surface to which the frame was presented. Some processes
85*6dbdd20aSAndroid Build Coastguard Workerupdate frames to multiple surfaces. Here, multiple slices with the same token
86*6dbdd20aSAndroid Build Coastguard Workerwill be shown in the Actual Timeline. Layer Name can be a good way to
87*6dbdd20aSAndroid Build Coastguard Workerdisambiguate between these slices.
88*6dbdd20aSAndroid Build Coastguard Worker* **Is Buffer?**
89*6dbdd20aSAndroid Build Coastguard Worker
90*6dbdd20aSAndroid Build Coastguard WorkerBoolean that tells if the frame corresponds to a buffer or an animation.
91*6dbdd20aSAndroid Build Coastguard Worker
92*6dbdd20aSAndroid Build Coastguard Worker### Flow events
93*6dbdd20aSAndroid Build Coastguard Worker
94*6dbdd20aSAndroid Build Coastguard WorkerSelecting an actual timeline slice in the app also draws a line back to the
95*6dbdd20aSAndroid Build Coastguard Workercorresponding SurfaceFlinger timeline slice.
96*6dbdd20aSAndroid Build Coastguard Worker
97*6dbdd20aSAndroid Build Coastguard Worker![](/docs/images/frametimeline/select-app-slice.png)
98*6dbdd20aSAndroid Build Coastguard Worker
99*6dbdd20aSAndroid Build Coastguard WorkerSince SurfaceFlinger can composite frames from multiple layers into a single
100*6dbdd20aSAndroid Build Coastguard Workerframe-on-screen (called a **DisplayFrame**), selecting a DisplayFrame draws
101*6dbdd20aSAndroid Build Coastguard Workerarrows to all the frames that were composited together. This can span over
102*6dbdd20aSAndroid Build Coastguard Workermultiple processes.
103*6dbdd20aSAndroid Build Coastguard Worker
104*6dbdd20aSAndroid Build Coastguard Worker![](/docs/images/frametimeline/select-sf-slice-1.png)
105*6dbdd20aSAndroid Build Coastguard Worker![](/docs/images/frametimeline/select-sf-slice-2.png)
106*6dbdd20aSAndroid Build Coastguard Worker
107*6dbdd20aSAndroid Build Coastguard Worker### Color codes
108*6dbdd20aSAndroid Build Coastguard Worker
109*6dbdd20aSAndroid Build Coastguard Worker| Color | Image | Description    |
110*6dbdd20aSAndroid Build Coastguard Worker| :---      | :---: | :---           |
111*6dbdd20aSAndroid Build Coastguard Worker| Green | ![](/docs/images/frametimeline/green.png) | A good frame. No janks observed |
112*6dbdd20aSAndroid Build Coastguard Worker| Light Green | ![](/docs/images/frametimeline/light-green.png) | High latency state. The framerate is smooth but frames are presented late, resulting in an increased input latency.|
113*6dbdd20aSAndroid Build Coastguard Worker| Red | ![](/docs/images/frametimeline/red.png) | Janky frame. The process the slice belongs to, is the reason for the jank. |
114*6dbdd20aSAndroid Build Coastguard Worker| Yellow | ![](/docs/images/frametimeline/yellow.png) | Used only by the apps. The frame is janky but app wasn't the reason, SurfaceFlinger caused the jank. |
115*6dbdd20aSAndroid Build Coastguard Worker| Blue | ![](/docs/images/frametimeline/blue.png) | Dropped frame. Not related to jank. The frame was dropped by SurfaceFlinger, preferring an updated frame over this. |
116*6dbdd20aSAndroid Build Coastguard Worker
117*6dbdd20aSAndroid Build Coastguard Worker## Janks explained
118*6dbdd20aSAndroid Build Coastguard Worker
119*6dbdd20aSAndroid Build Coastguard WorkerThe jank types are defined in
120*6dbdd20aSAndroid Build Coastguard Worker[JankInfo.h](https://cs.android.com/android/platform/superproject/main/+/main:frameworks/native/libs/gui/include/gui/JankInfo.h?l=22).
121*6dbdd20aSAndroid Build Coastguard WorkerSince each app is written differently, there is no common way to go into the
122*6dbdd20aSAndroid Build Coastguard Workerinternals of the apps and specify what the reason for the jank was. Our goal is
123*6dbdd20aSAndroid Build Coastguard Workernot to do this but rather, provide a quick way to tell if app was janky or if
124*6dbdd20aSAndroid Build Coastguard WorkerSurfaceFlinger was janky.
125*6dbdd20aSAndroid Build Coastguard Worker
126*6dbdd20aSAndroid Build Coastguard Worker### None
127*6dbdd20aSAndroid Build Coastguard Worker
128*6dbdd20aSAndroid Build Coastguard WorkerAll good. No jank with the frame. The ideal state that should be aimed for.
129*6dbdd20aSAndroid Build Coastguard Worker
130*6dbdd20aSAndroid Build Coastguard Worker### App janks
131*6dbdd20aSAndroid Build Coastguard Worker
132*6dbdd20aSAndroid Build Coastguard Worker* **AppDeadlineMissed**
133*6dbdd20aSAndroid Build Coastguard Worker
134*6dbdd20aSAndroid Build Coastguard WorkerThe app ran longer than expected causing a jank. The total time taken by the app
135*6dbdd20aSAndroid Build Coastguard Workerframe is calculated by using the choreographer wake-up as the start time and
136*6dbdd20aSAndroid Build Coastguard Workermax(gpu, post time) as the end time. Post time is the time the frame was sent to
137*6dbdd20aSAndroid Build Coastguard WorkerSurfaceFlinger. Since the GPU usually runs in parallel, it could be that the gpu
138*6dbdd20aSAndroid Build Coastguard Workerfinished later than the post time.
139*6dbdd20aSAndroid Build Coastguard Worker
140*6dbdd20aSAndroid Build Coastguard Worker* **BufferStuffing**
141*6dbdd20aSAndroid Build Coastguard Worker
142*6dbdd20aSAndroid Build Coastguard WorkerThis is more of a state than a jank. This happens if the app keeps sending new
143*6dbdd20aSAndroid Build Coastguard Workerframes to SurfaceFlinger before the previous frame was even presented. The
144*6dbdd20aSAndroid Build Coastguard Workerinternal Buffer Queue is stuffed with buffers that are yet to be presented,
145*6dbdd20aSAndroid Build Coastguard Workerhence the name, Buffer Stuffing. These extra buffers in the queue are presented
146*6dbdd20aSAndroid Build Coastguard Workeronly one after the other thus resulting in extra latency.
147*6dbdd20aSAndroid Build Coastguard WorkerThis can also result in a stage where there are no more buffers for the app to
148*6dbdd20aSAndroid Build Coastguard Workeruse and it goes into a dequeue blocking wait.
149*6dbdd20aSAndroid Build Coastguard WorkerThe actual duration of work performed by the app might still be within the
150*6dbdd20aSAndroid Build Coastguard Workerdeadline, but due to the stuffed nature, all the frames will be presented at
151*6dbdd20aSAndroid Build Coastguard Workerleast one vsync late no matter how quickly the app finishes its work.
152*6dbdd20aSAndroid Build Coastguard WorkerFrames will still be smooth in this state but there is an increased input
153*6dbdd20aSAndroid Build Coastguard Workerlatency associated with the late present.
154*6dbdd20aSAndroid Build Coastguard Worker
155*6dbdd20aSAndroid Build Coastguard Worker### SurfaceFlinger Janks
156*6dbdd20aSAndroid Build Coastguard Worker
157*6dbdd20aSAndroid Build Coastguard WorkerThere are two ways SurfaceFlinger can composite frames.
158*6dbdd20aSAndroid Build Coastguard Worker* Device Composition - uses a dedicated hardware
159*6dbdd20aSAndroid Build Coastguard Worker* GPU/Client composition - uses GPU to composite
160*6dbdd20aSAndroid Build Coastguard Worker
161*6dbdd20aSAndroid Build Coastguard WorkerAn important thing to note is that performing device composition happens as a
162*6dbdd20aSAndroid Build Coastguard Workerblocking call on the main thread. However, GPU composition happens in parallel.
163*6dbdd20aSAndroid Build Coastguard WorkerSurfaceFlinger performs the necessary draw calls and then hands over the gpu
164*6dbdd20aSAndroid Build Coastguard Workerfence to the display device. The display device then waits for the fence to be
165*6dbdd20aSAndroid Build Coastguard Workersignaled, and then presents the frame.
166*6dbdd20aSAndroid Build Coastguard Worker
167*6dbdd20aSAndroid Build Coastguard Worker* **SurfaceFlingerCpuDeadlineMissed**
168*6dbdd20aSAndroid Build Coastguard Worker
169*6dbdd20aSAndroid Build Coastguard WorkerSurfaceFlinger is expected to finish within the given deadline. If the main
170*6dbdd20aSAndroid Build Coastguard Workerthread ran for longer than that, the jank is then
171*6dbdd20aSAndroid Build Coastguard WorkerSurfaceFlingerCpuDeadlineMissed. SurfaceFlinger’s CPU time is the time spent on
172*6dbdd20aSAndroid Build Coastguard Workerthe main thread. This includes the entire composition time if device composition
173*6dbdd20aSAndroid Build Coastguard Workerwas used. If GPU composition was used, this includes the time to write the draw
174*6dbdd20aSAndroid Build Coastguard Workercalls and handing over the frame to the GPU.
175*6dbdd20aSAndroid Build Coastguard Worker
176*6dbdd20aSAndroid Build Coastguard Worker* **SurfaceFlingerGpuDeadlineMissed**
177*6dbdd20aSAndroid Build Coastguard Worker
178*6dbdd20aSAndroid Build Coastguard WorkerThe time taken by SurfaceFlinger’s main thread on the CPU + the GPU composition
179*6dbdd20aSAndroid Build Coastguard Workertime together were longer than expected. Here, the CPU time would have still
180*6dbdd20aSAndroid Build Coastguard Workerbeen within the deadline but since the work on the GPU wasn’t ready on time, the
181*6dbdd20aSAndroid Build Coastguard Workerframe got pushed to the next vsync.
182*6dbdd20aSAndroid Build Coastguard Worker
183*6dbdd20aSAndroid Build Coastguard Worker* **DisplayHAL**
184*6dbdd20aSAndroid Build Coastguard Worker
185*6dbdd20aSAndroid Build Coastguard WorkerDisplayHAL jank refers to the case where SurfaceFlinger finished its work and
186*6dbdd20aSAndroid Build Coastguard Workersent the frame down to the HAL on time, but the frame wasn’t presented on the
187*6dbdd20aSAndroid Build Coastguard Workervsync. It was presented on the next vsync. It could be that SurfaceFlinger did
188*6dbdd20aSAndroid Build Coastguard Workernot give enough time for the HAL’s work or it could be that there was a genuine
189*6dbdd20aSAndroid Build Coastguard Workerdelay in the HAL’s work.
190*6dbdd20aSAndroid Build Coastguard Worker
191*6dbdd20aSAndroid Build Coastguard Worker* **PredictionError**
192*6dbdd20aSAndroid Build Coastguard Worker
193*6dbdd20aSAndroid Build Coastguard WorkerSurfaceFlinger’s scheduler plans ahead the time to present the frames. However,
194*6dbdd20aSAndroid Build Coastguard Workerthis prediction sometimes drifts away from the actual hardware vsync time. For
195*6dbdd20aSAndroid Build Coastguard Workerexample, a frame might have predicted present time as 20ms. Due to a drift in
196*6dbdd20aSAndroid Build Coastguard Workerestimation, the actual present time of the frame could be 23ms. This is called a
197*6dbdd20aSAndroid Build Coastguard WorkerPrediction Error in SurfaceFlinger’s scheduler. The scheduler corrects itself
198*6dbdd20aSAndroid Build Coastguard Workerperiodically, so this drift isn’t permanent. However, the frames that had a
199*6dbdd20aSAndroid Build Coastguard Workerdrift in prediction will still be classified as jank for tracking purposes.
200*6dbdd20aSAndroid Build Coastguard Worker
201*6dbdd20aSAndroid Build Coastguard WorkerIsolated prediction errors are not usually perceived by the user as the
202*6dbdd20aSAndroid Build Coastguard Workerscheduler is quick to adapt and fix the drift.
203*6dbdd20aSAndroid Build Coastguard Worker
204*6dbdd20aSAndroid Build Coastguard Worker### Unknown jank
205*6dbdd20aSAndroid Build Coastguard Worker
206*6dbdd20aSAndroid Build Coastguard WorkerAs the name suggests, the reason for the jank is unknown in this case. An
207*6dbdd20aSAndroid Build Coastguard Workerexample here would be that SurfaceFlinger or the App took longer than expected
208*6dbdd20aSAndroid Build Coastguard Workerand missed the deadline but the frame was still presented early. The probability
209*6dbdd20aSAndroid Build Coastguard Workerof such a jank happening is very low but not impossible.
210*6dbdd20aSAndroid Build Coastguard Worker
211*6dbdd20aSAndroid Build Coastguard Worker## SQL
212*6dbdd20aSAndroid Build Coastguard Worker
213*6dbdd20aSAndroid Build Coastguard WorkerAt the SQL level, frametimeline data is available in two tables
214*6dbdd20aSAndroid Build Coastguard Worker* [`expected_frame_timeline_slice`](/docs/analysis/sql-tables.autogen#expected_frame_timeline_slice)
215*6dbdd20aSAndroid Build Coastguard Worker* [`actual_frame_timeline_slice`](/docs/analysis/sql-tables.autogen#actual_frame_timeline_slice)
216*6dbdd20aSAndroid Build Coastguard Worker
217*6dbdd20aSAndroid Build Coastguard Worker```
218*6dbdd20aSAndroid Build Coastguard Workerselect ts, dur, surface_frame_token as app_token, display_frame_token as sf_token, process.name
219*6dbdd20aSAndroid Build Coastguard Workerfrom expected_frame_timeline_slice left join process using(upid)
220*6dbdd20aSAndroid Build Coastguard Worker```
221*6dbdd20aSAndroid Build Coastguard Worker
222*6dbdd20aSAndroid Build Coastguard Workerts | dur | app_token | sf_token | name
223*6dbdd20aSAndroid Build Coastguard Worker---|-----|-----------|----------|-----
224*6dbdd20aSAndroid Build Coastguard Worker60230453475 | 20500000 | 3135 | 3142 | com.google.android.apps.nexuslauncher
225*6dbdd20aSAndroid Build Coastguard Worker60241677540 | 20500000 | 3137 | 3144 | com.google.android.apps.nexuslauncher
226*6dbdd20aSAndroid Build Coastguard Worker60252895412 | 20500000 | 3139 | 3146 | com.google.android.apps.nexuslauncher
227*6dbdd20aSAndroid Build Coastguard Worker60284614241 | 10500000 | 0 | 3144 | /system/bin/surfaceflinger
228*6dbdd20aSAndroid Build Coastguard Worker60295858299 | 10500000 | 0 | 3146 | /system/bin/surfaceflinger
229*6dbdd20aSAndroid Build Coastguard Worker60297798913 | 20500000 | 3147 | 3150 | com.android.systemui
230*6dbdd20aSAndroid Build Coastguard Worker60307075728 | 10500000 | 0 | 3148 | /system/bin/surfaceflinger
231*6dbdd20aSAndroid Build Coastguard Worker60318297746 | 10500000 | 0 | 3150 | /system/bin/surfaceflinger
232*6dbdd20aSAndroid Build Coastguard Worker60320236468 | 20500000 | 3151 | 3154 | com.android.systemui
233*6dbdd20aSAndroid Build Coastguard Worker60329511401 | 10500000 | 0 | 3152 | /system/bin/surfaceflinger
234*6dbdd20aSAndroid Build Coastguard Worker60340732956 | 10500000 | 0 | 3154 | /system/bin/surfaceflinger
235*6dbdd20aSAndroid Build Coastguard Worker60342673064 | 20500000 | 3155 | 3158 | com.android.systemui
236*6dbdd20aSAndroid Build Coastguard Worker
237*6dbdd20aSAndroid Build Coastguard Worker
238*6dbdd20aSAndroid Build Coastguard Worker```
239*6dbdd20aSAndroid Build Coastguard Workerselect ts, dur, surface_frame_token as app_token, display_frame_token, jank_type, on_time_finish, present_type, layer_name, process.name
240*6dbdd20aSAndroid Build Coastguard Workerfrom actual_frame_timeline_slice left join process using(upid)
241*6dbdd20aSAndroid Build Coastguard Worker```
242*6dbdd20aSAndroid Build Coastguard Worker
243*6dbdd20aSAndroid Build Coastguard Workerts | dur | app_token | sf_token | jank_type | on_time_finish | present_type | layer_name | name
244*6dbdd20aSAndroid Build Coastguard Worker---|-----|-----------|----------|-----------|----------------|--------------|------------|-----
245*6dbdd20aSAndroid Build Coastguard Worker60230453475 | 26526379 | 3135 | 3142 | Buffer Stuffing | 1 | Late Present | TX - com.google.android.apps.nexuslauncher/com.google.android.apps.nexuslauncher.NexusLauncherActivity#0 | com.google.android.apps.nexuslauncher
246*6dbdd20aSAndroid Build Coastguard Worker60241677540 | 28235805 | 3137 | 3144 | Buffer Stuffing | 1 | Late Present | TX - com.google.android.apps.nexuslauncher/com.google.android.apps.nexuslauncher.NexusLauncherActivity#0 | com.google.android.apps.nexuslauncher
247*6dbdd20aSAndroid Build Coastguard Worker60252895412 | 2546525 | 3139 | 3142 | None | 1 | On-time Present | TX - NavigationBar0#0 | com.android.systemui
248*6dbdd20aSAndroid Build Coastguard Worker60252895412 | 27945382 | 3139 | 3146 | Buffer Stuffing | 1 | Late Present | TX - com.google.android.apps.nexuslauncher/com.google.android.apps.nexuslauncher.NexusLauncherActivity#0 | com.google.android.apps.nexuslauncher
249*6dbdd20aSAndroid Build Coastguard Worker60284808190 | 10318230 | 0 | 3144 | None | 1 | On-time Present | [NULL] | /system/bin/surfaceflinger
250*6dbdd20aSAndroid Build Coastguard Worker60296067722 | 10265574 | 0 | 3146 | None | 1 | On-time Present | [NULL] | /system/bin/surfaceflinger
251*6dbdd20aSAndroid Build Coastguard Worker60297798913 | 5239227 | 3147 | 3150 | None | 1 | On-time Present | TX - NavigationBar0#0 | com.android.systemui
252*6dbdd20aSAndroid Build Coastguard Worker60307246161 | 10301772 | 0 | 3148 | None | 1 | On-time Present | [NULL] | /system/bin/surfaceflinger
253*6dbdd20aSAndroid Build Coastguard Worker60318497204 | 10281199 | 0 | 3150 | None | 1 | On-time Present | [NULL] | /system/bin/surfaceflinger
254*6dbdd20aSAndroid Build Coastguard Worker60320236468 | 2747559 | 3151 | 3154 | None | 1 | On-time Present | TX - NavigationBar0#0 | com.android.systemui
255*6dbdd20aSAndroid Build Coastguard Worker
256*6dbdd20aSAndroid Build Coastguard Worker## TraceConfig
257*6dbdd20aSAndroid Build Coastguard Worker
258*6dbdd20aSAndroid Build Coastguard WorkerTrace Protos:
259*6dbdd20aSAndroid Build Coastguard Worker[FrameTimelineEvent](/docs/reference/trace-packet-proto.autogen#FrameTimelineEvent)
260*6dbdd20aSAndroid Build Coastguard Worker
261*6dbdd20aSAndroid Build Coastguard WorkerDatasource:
262*6dbdd20aSAndroid Build Coastguard Worker
263*6dbdd20aSAndroid Build Coastguard Worker```protobuf
264*6dbdd20aSAndroid Build Coastguard Workerdata_sources {
265*6dbdd20aSAndroid Build Coastguard Worker    config {
266*6dbdd20aSAndroid Build Coastguard Worker        name: "android.surfaceflinger.frametimeline"
267*6dbdd20aSAndroid Build Coastguard Worker    }
268*6dbdd20aSAndroid Build Coastguard Worker}
269*6dbdd20aSAndroid Build Coastguard Worker```
270*6dbdd20aSAndroid Build Coastguard Worker
271