Jetpack Compose

For Android engineers building Compose screens, this route connects state reads and rendering phases to list performance, gesture conflicts and regression checks. Start with the observable UI problem, then follow the relevant mechanism.

Free diagnostic tool

Compose compiler report reader: paste a release *-composables.txt locally to inspect function flags and parameter labels. Includes a sample, filters, and a summary. It does not upload reports or treat unstable parameters as failed performance tests. Start with the updated Strong Skipping guide.

Start with your question

QuestionRead firstWhat to inspect
Which phase runs after this state changes?Composition, layout and draw phasesWhere state is read and which scope is invalidated
Why does this LazyColumn stutter or recompose frequently?LazyColumn scroll performanceFrame duration, build mode, stable keys, contentType and work per item
Why do taps, drags or nested scrolling conflict?Gesture dispatch and nested scrollingInput abstraction, consumption, coroutine keys and remaining scroll delta

A practical reading order

  1. Use the three-phase model to identify where state is read. Recomposition counts alone are not a performance verdict.
  2. Inspect item identity, data changes and frame timing in a real LazyColumn. Record Compose and Kotlin compiler versions with measurements.
  3. Follow the gesture debugging workflow for competing taps and drags, then examine how nested scrolling distributes consumption.
  4. For system evidence, continue with Perfetto. For visual regressions, see Compose screenshot testing.

Core Articles

Layout, Drawing, and State Scope

Common Questions

  • Why does this composable recompose so often?
  • Should state be read in composition, layout, or draw?
  • When is remember enough, and when do I need derivedStateOf?
  • How should a screen be split to avoid making every state change invalidate the whole tree?
  • How do I migrate a View-based screen without losing lifecycle control or scroll behavior?

Next Step

If your Compose code relies heavily on Flow, StateFlow, and structured concurrency, continue with Kotlin and Coroutines.