Jetpack Compose 深度解析专题

面向正在开发 Compose 界面的 Android 工程师。这条路线从状态读取和渲染阶段出发,连接列表性能、手势冲突与回归验证,帮助把“界面不对劲”收敛为可以检查的问题。

按问题选择入口

当前问题先读这篇检查重点
不清楚状态变化会触发哪一阶段Composition、Layout、Draw 三阶段状态在哪里读取,以及哪个作用域被重新执行
LazyColumn 卡顿,重组次数很多LazyColumn 滑动性能排查帧耗时、构建模式、稳定 key、contentType 与工作量
点击、拖拽或父子滚动冲突手势分发与嵌套滚动输入抽象层、事件消费、协程 key 与剩余滚动量

免费排查工具

Compose 编译报告阅读器:在浏览器本地粘贴 release *-composables.txt,按函数查看 restartable、skippable 与参数标签。提供示例、筛选和摘要;不上传报告,也不把 unstable 当成性能失败。配套阅读更新后的 Strong Skipping 排查指南。

推荐阅读顺序

  1. 用 三阶段模型 理解状态读取位置。不要仅凭重组计数判断性能。
  2. 在 LazyColumn 中检查真实列表的身份、数据变更和帧时间;记录 Compose 与 Kotlin 编译器版本。
  3. 用 手势排查流程 处理点击与拖拽竞争,再检查嵌套滚动的消费分配。
  4. 需要系统证据时转到 Perfetto 入门;需要防止视觉回归时看 Compose 截图测试。

核心文章

布局、绘制与状态作用域

常见问题

  • 为什么参数没变,Composable 还是频繁重组?
  • derivedStateOf 应该用在哪里,不应该用在哪里?
  • Modifier 的顺序为什么会影响布局、绘制和点击?
  • Compose 动画卡顿时应该看什么指标?
  • Glance 和 RemoteViews 的关系是什么?

下一步

Compose 的状态流通常依赖 Kotlin Flow 和协程,建议继续阅读 Kotlin 与协程工程实践。