YearGridView 首帧 168ms 中约 24ms 来自 remember 同步文本测量。 将 dayLayouts/titleLayouts/weekdayLayouts 改为 produceState, 首帧 Canvas 渲染为空(sharedElement 结构不变),第二帧填充内容。 DEVELOPMENT.md 补充已知性能瓶颈分析和 Baseline Profile 覆盖建议。
3.1 KiB
3.1 KiB
开发指南
性能追踪
使用 scripts/profile.sh 一键抓取 Perfetto trace、帧统计和内存快照。
# 默认抓取 8 秒
./scripts/profile.sh
# 抓取 15 秒
./scripts/profile.sh 15
# 应用已在运行时,不自动启动
./scripts/profile.sh --no-launch
输出文件保存在 logs/ 目录:
| 文件 | 说明 |
|---|---|
trace_*.perfetto-trace |
Perfetto trace,在 https://ui.perfetto.dev 打开 |
framestats_*.txt |
GPU 帧统计 |
meminfo_*.txt |
内存快照 |
report_*.md |
追踪报告摘要 |
trace 中包含自定义标记:
MonthView:Compose— 月视图重组YearView:Compose— 年视图重组YearGridView:*— 年视图网格组合(首帧耗时关键指标)generateMiniMonthDays:*— 月份网格计算VM:collapseProgress— 折叠动画
已知性能瓶颈
AnimatedGif 持续解码
AnimatedGif 中的 250×250 WebP 动画在 repeatCount 未限制时会以 11-14 FPS 无限循环解码,
持续消耗 CPU/GPU。已通过 ImageOptions { repeatCount(2) } 限制播放 3 次后停止。
YearGridView 首帧 168ms
切换到年视图时,YearGridView 首次组合需要:
- 创建 12 个 MiniMonth composable(含
sharedElement+clickable+Canvas等 modifier 节点) - 124 次文本测量(93 日期 + 24 标题 + 7 星期)
SharedTransitionLayout注册 12 个共享元素
文本测量已通过 produceState 延迟到第二帧执行,首帧 Canvas 渲染为空。
剩余 ~140ms 是 12 个 composable 节点创建 + layout 的 Compose 运行时开销,
需要通过 Baseline Profile 预编译相关类来优化。
确保 macrobenchmark 的 BaselineProfileGenerator 覆盖以下路径:
- 冷启动 → FAB → 年视图(触发 YearGridView 首次组合)
- 年视图 → 点击任意月份返回月视图(触发 sharedElement 转场)
CalendarPager 预加载
beyondViewportPageCount 已设为 0,避免翻页时预加载相邻月页导致的帧丢失。
如需恢复预加载,注意 compose:lazy:prefetch 可能产生 400-700ms 卡顿。
Baseline Profile
# 编译 Android debug APK
./gradlew :app:assembleDebug
# 安装到设备
./gradlew :app:installDebug
# 编译 release APK(含 Baseline Profiles)
./gradlew :app:assembleRelease
./gradlew :app:installBenchmark
Baseline Profile 自动生成器。
运行方式(一键生成 + 自动复制到 :core):
./gradlew :macrobenchmark:updateBaselineProfile
仅运行基准测试(不自动复制):
./gradlew :macrobenchmark:connectedBenchmarkAndroidTest
手动复制路径:
macrobenchmark/build/outputs/connected_android_test_additional_output/
测试覆盖全部用户交互路径,实现全量 AOT:
- 冷启动 → 首帧渲染
- FAB 展开 → 年视图 → 月视图
- 日期选择 → 周视图折叠/展开
- 关于页 → 开源许可页
- 返回主界面
模拟器
emulator -avd Pixel_10 \
-no-snapshot \
-no-boot-anim \
-gpu host \
-accel on \
-cores 4 \
-memory 4096 \
-partition-size 2048