Compose Performance Audit 用于端到端审计 Jetpack Compose 视图性能,涵盖从插桩、基线采集到根因分析和具体修复步骤。
用途与工作流 该技能适用于诊断渲染缓慢、滚动卡顿、过度重组等性能问题。其工作流决策树为:如果用户提供代码,从“代码优先审查”开始;如果用户仅描述症状,先请求最小代码或上下文,再进行代码优先审查;如果代码审查无法得出结论,则进入“指导用户采集性能数据”阶段,要求提供 Layout Inspector 输出或 Perfetto 跟踪。
主要能力
- 代码优先审查:收集目标 Composable 代码、数据流(状态、remember、派生状态、ViewModel 连接)以及症状与复现步骤。重点关注不稳定的参数或大范围状态变化导致的重组风暴、LazyColumn/LazyRow 中不稳定的 key、组合期间的重负载工作、不必要的重组、未正确设置尺寸或异步加载的大图片、布局抖动等。输出可能根因(附代码引用)、建议修复与重构,必要时给出最小复现或插桩建议。
- 指导用户采集性能数据:说明如何使用 Android Studio 的 Layout Inspector 查看重组次数、在 Compose 工具中启用重组高亮、使用 Perfetto 或 System Trace 进行帧时序分析、检查 Macrobenchmark 的启动与滚动指标。要求提供显示重组次数的 Layout Inspector 截图、Perfetto 跟踪或 System Trace 导出、设备/系统/构建配置(debug 还是 release)。重要提示:确保在启用 R8 的 release 构建上进行性能分析,debug 构建开销显著。
- 分析与诊断:优先排查常见 Compose 问题,包括不稳定参数或大范围状态变化导致的重组风暴、懒列表 key 不稳定(key 抖动、基于索引的 key)、组合期间的重负载工作、缺少 remember 导致每次重组重新创建、未用 Modifier.size() 约束的大图片、在错误组合阶段进行不必要的状态读取。结合跟踪与 Layout Inspector 证据总结发现。
- 修复:应用针对性修复,如使用 @Stable 或 @Immutable 注解稳定参数、为懒列表项使用稳定唯一 ID、延迟状态读取(derivedStateOf、基于 lambda 的修饰符、Modifier.drawBehind)、用 remember 缓存昂贵计算、通过提取稳定 Composable 或 key() 控制身份来跳过重组、使用 Coil/Glide 并加尺寸约束异步加载图片、扁平化层级减少布局复杂度。
常见代码坏味与修复 资料给出了不稳定 lambda 捕获、组合中的昂贵工作、LazyColumn 缺少 key、不稳定数据类、过早读取状态、组合中对象分配等代码示例,并分别给出使用 remember、key、@Immutable、延迟状态读取、缓存 Modifier 等修复方式。
稳定性检查清单 资料列出:基本类型(Int、String、Boolean)默认稳定;字段稳定的 data class 稳定(需确保所有字段稳定);List、Map、Set 不稳定,可使用 kotlinx 的 ImmutableList;含 var 属性的类不稳定,若外部稳定可用 @Stable;Lambda 默认不稳定,可用 remember { }。
验证与输出 验证阶段,要求用户重新运行 Layout Inspector 比较重组次数、运行 Macrobenchmark 比较帧时序、在 release 构建的真机上进行测试,并在提供数据时总结差异。输出包括简短指标表(若可用则含前后对比)、按影响排序的主要问题、建议修复与预估工作量。
参考资料 Jetpack Compose Performance、Compose Stability Explained、Debugging Recomposition、Macrobenchmark。