该技能面向 Jetpack Compose 性能优化,核心是避免把组合放进测量阶段。SubcomposeLayout 在测量阶段执行子内容组合,BoxWithConstraints、material3.Scaffold 和懒加载布局都基于它,代价在嵌套或热路径中才显现。
用途:当开发者报告多余测量、首帧慢、旋转或弹键盘时卡顿、懒列表滚动卡顿,或 Perfetto 追踪显示测量阶段组合随父约束变化增长时使用。
主要能力与做法:
- 排查热路径中所有 SubcomposeLayout 使用者(BoxWithConstraints、Scaffold、自定义布局)。
- 判断约束是否真的在组合期被消费;仅用于读取 maxWidth/maxHeight 时改用 Modifier.onSizeChanged 或 Modifier.layout。
- 避免嵌套子组合布局,把 BoxWithConstraints 提到根节点,用普通布局处理内部分支。
- 不在 LazyColumn/LazyRow/LazyVerticalGrid 的 item 中放 BoxWithConstraints,由父级解析后传值。
- 不嵌套 Scaffold,使用其 topBar、bottomBar、snackbarHost、floatingActionButton 插槽。
- 确需 SubcomposeLayout 时传入 SubcomposeSlotReusePolicy(如 maxSlotsToRetainForReuse = 8),可预测的槽位用 state.precompose。
- 用 Perfetto 与 Layout Inspector 验证 Compose:recompose 和 Compose:applyChanges 不再随父约束变化触发。
限制:当子内容组合确实依赖已测量尺寸(如共享元素、锚点弹层)时不应替换,应保留并调优。此技能针对子组合问题;若慢因是参数不稳定或动画状态读取,应改用稳定性诊断或状态读取延迟技能。资料未提供具体收费、平台或安装信息。