From android-dev
Audits Jetpack Compose runtime performance via code review and profiling. Diagnoses slow rendering, janky scrolling, and excessive recompositions.
How this skill is triggered — by the user, by Claude, or both
Slash command
/android-dev:compose-performance-auditThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Audit Jetpack Compose view performance end-to-end, from instrumentation and baselining to root-cause analysis and concrete remediation steps.
Audit Jetpack Compose view performance end-to-end, from instrumentation and baselining to root-cause analysis and concrete remediation steps.
Collect:
Focus on:
LazyColumn/LazyRow (key churn, missing keys).remember, unstable classes, lambdas).SubcomposeLayout misuse).Provide:
Explain how to collect data:
Ask for:
Important: Ensure profiling is done on a release build with R8 enabled. Debug builds have significant overhead.
Prioritize likely Compose culprits:
key churn, index-based keys).remember causing recreations on every recomposition.Modifier.size() constraints.Summarize findings with evidence from traces/Layout Inspector.
Apply targeted fixes:
@Stable or @Immutable annotations on data classes.LazyColumn/LazyRow items.derivedStateOf, lambda-based modifiers, or Modifier.drawBehind.remember { } or remember(key) { }.key() to control identity.// BAD: New lambda instance every recomposition
Button(onClick = { viewModel.doSomething(item) }) { ... }
// GOOD: Use remember or method reference
val onClick = remember(item) { { viewModel.doSomething(item) } }
Button(onClick = onClick) { ... }
// BAD: Sorting on every recomposition
@Composable
fun ItemList(items: List<Item>) {
val sorted = items.sortedBy { it.name } // Runs every recomposition
LazyColumn { items(sorted) { ... } }
}
// GOOD: Use remember with key
@Composable
fun ItemList(items: List<Item>) {
val sorted = remember(items) { items.sortedBy { it.name } }
LazyColumn { items(sorted) { ... } }
}
// BAD: Index-based identity (causes recomposition on list changes)
LazyColumn {
items(items) { item -> ItemRow(item) }
}
// GOOD: Stable key-based identity
LazyColumn {
items(items, key = { it.id }) { item -> ItemRow(item) }
}
// BAD: Unstable (contains List, which is not stable)
data class UiState(
val items: List<Item>,
val isLoading: Boolean
)
// GOOD: Mark as Immutable if truly immutable
@Immutable
data class UiState(
val items: ImmutableList<Item>, // kotlinx.collections.immutable
val isLoading: Boolean
)
// BAD: State read during composition (recomposes whole tree)
@Composable
fun AnimatedBox(scrollState: ScrollState) {
val offset = scrollState.value // Recomposes on every scroll
Box(modifier = Modifier.offset(y = offset.dp)) { ... }
}
// GOOD: Defer state read to layout/draw phase
@Composable
fun AnimatedBox(scrollState: ScrollState) {
Box(modifier = Modifier.offset {
IntOffset(0, scrollState.value) // Read in layout phase
}) { ... }
}
// BAD: Creates new Modifier chain every recomposition
Box(modifier = Modifier.padding(16.dp).background(Color.Red))
// GOOD for dynamic modifiers: Remember the modifier
val modifier = remember { Modifier.padding(16.dp).background(Color.Red) }
Box(modifier = modifier)
| Type | Stable by Default? | Fix |
|---|---|---|
Primitives (Int, String, Boolean) | Yes | N/A |
data class with stable fields | Yes* | Ensure all fields are stable |
List, Map, Set | No | Use ImmutableList from kotlinx |
Classes with var properties | No | Use @Stable if externally stable |
| Lambdas | No | Use remember { } |
Ask the user to:
Summarize the delta (recomposition count, frame drops, jank) if provided.
Provide:
npx claudepluginhub p/hanamizuki-android-dev-plugins-android-devDiagnoses and fixes Jetpack Compose performance problems including stability, recomposition, lazy layouts, modifiers, side effects, and build configuration. 26 skills for diagnosing and fixing specific issues.
Investigates Jetpack Compose recomposition performance across three axes: parameter stability, State read phase, and cross-phase back-writing. Routes to focused skills for deeper fixes.
Expert on Compose and Compose Multiplatform for UI across Android, Desktop, iOS, and Web. Covers Compose APIs, KMP commonMain, Android TV, Paging 3, Material 3, and design-to-code workflows. Activates on GitHub PR review requests and auto-detects Compose projects.