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 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 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 55*6dbdd20aSAndroid Build Coastguard Worker 56*6dbdd20aSAndroid Build Coastguard Worker 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 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 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 105*6dbdd20aSAndroid Build Coastguard Worker 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 |  | A good frame. No janks observed | 112*6dbdd20aSAndroid Build Coastguard Worker| Light Green |  | High latency state. The framerate is smooth but frames are presented late, resulting in an increased input latency.| 113*6dbdd20aSAndroid Build Coastguard Worker| Red |  | Janky frame. The process the slice belongs to, is the reason for the jank. | 114*6dbdd20aSAndroid Build Coastguard Worker| Yellow |  | 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 |  | 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