Jank & the frame budget

You have about 16 milliseconds

A screen refreshing at 60 frames per second gives your app roughly 16ms to produce each frame β€” measure, layout, draw, all of it. On a 90Hz or 120Hz display that budget shrinks further, to about 11ms or 8ms. Miss it and the screen shows the same frame twice: a dropped frame the walker actually feels as a stutter. That stutter has a name: jank.

All of this work happens on the main thread β€” the same thread that handles touch input and runs your Compose code. Block it with something slow (a big computation, a synchronous disk read, a database query) and every frame due during that block gets janked, not just one.

One of the most common causes of jank in a Compose app isn't a slow computation at all β€” it's a composable recomposing far more often than it needs to, redoing layout and draw work every time some unrelated state ticks, like a live GPS position updating 10 times a second and dragging a whole screen along with it.

Don't guess where the time is going. Android Studio's Layout Inspector shows you recomposition counts per composable, and a system trace (Perfetto) shows exactly which frames blew the budget and why. Measure first, then fix.