作者 / Android 开发者关系工程师 Ben Trengrove
我们在 Compose 2023 年 8 月物料清单 (BoM) 中发布了 Jetpack Compose 1.5 版本。Jetpack Compose 是 Android 现代原生界面工具包,已经被 Google Play 商店、Dropbox 和 Airbnb 等应用采用。此版本主要侧重于性能改进,因为我们从 2022 年 10 月版本开始的 修饰符重构 工作的主要部分现已完成合并。
- Compose 2023 年 8 月物料清单 (BoM)
- Jetpack Compose https://developer.android.google.cn/jetpack/compose#apps-built-with-compose
- 已经被众多应用采用
- Google Play 商店
- Airbnb
- 修饰符重构
性能
当我们 于 2021 年首次推出 Compose 1.0 时,我们专注于确保 API 接口的准确性,以提供稳定的构建基础。我们那时想要功能强大、表现力强、易于使用且稳定的 API,以便让开发者在生产环境中放心使用。随着我们持续改进 API,性能成为首要任务,因此在 2023 年 8 月版本中,我们已经实现了许多性能改进。
修饰符性能
在此版本中,修饰符性能得到大幅提升,较构建之初提升高达 80%。最令人欣慰的是,由于我们在首个版本就确保了 API 接口的准确性,您只需升级到 2023 年 8 月版本,即可让大部分应用享受这些好处。
我们借助基准测试套件以监测性能是否退化,并利用测试结果决定在哪些方面投入资源以改进性能。在首次发布 Compose 1.0 后,我们开始关注需要改进的地方。基准测试结果表明,我们在实现修饰符方面消耗的时间超过了预期。修饰符构成组合树的绝大部分,因此对 Compose 中初始组合时间的影响最大。在 2022 年 10 月版本中,我们开始在内部重构修饰符以使其更加高效。
在 2022 年 10 月的版本中,最低等级模块 Compose 界面中增加了新的 API 和性能改进。由于修饰符是建立在彼此之上的,因此我们在接下来的 2023 年 3 月版本 开始迁移 Compose Foundation 中的最低等级 Compose 修饰符。这包括 graphicsLayer、级别较低的焦点修饰符、padding 和 offset。这些低级别修饰符不仅用于 Clickable 等其他常用修饰符,还用于 Text 等许多框架可组合项。在 2023 年 3 月版本中,迁移修饰符已为这些组件带来性能提升,但当我们将更高等级的修饰符和可组合项本身迁移到新修饰符系统时,真正的优势才得以体现。
在 2023 年 8 月版本中,我们已开始将 Clickable
修饰符迁移至新修饰符系统,从而显著改善组合时间,在某些情况下改善幅度高达 80%。在包含可点击元素 (如按钮) 的惰性列表中,这一点尤为重要。Clickable 所使用的 Modifier.indication 仍在迁移中,因此我们预计未来的版本中还会有进一步更新。
在迁移工作中,我们发现了一个未参与原始重构过程的组合修饰符的用例,并添加了 新 API 来创建使用 CompositionLocal 实例的 Modifier.Node 元素。
我们正在编写文档,帮助您将自己的修饰符迁移至新的 Modifier.Node API。您可以参考 我们代码库中的示例,立即开始迁移。
如需详细了解上述更改背后的原理,您可以观看 2022 年 Android 开发者峰会的 "Compose 修饰符深度探讨" 演讲视频。
内存
此版本包含内存使用方面的一些改进。我们已仔细研究发生在不同 Compose API 间的分配,并减少了一些区域的总体分配,尤其是在图形堆栈和矢量资源加载方面。这不仅减少了 Compose 的内存占用,还直接提升了性能,因为我们在分配内存花费的时间减少了,也减少了垃圾收集。
此外,我们还修复了一个在使用 ComposeView 时出现的 内存泄漏 问题。修复后,所有应用,尤其是使用多 Activity 架构或大量 View/Compose 互操作性功能的应用将从中受益。
文本
BasicText 已迁移至修饰符支持的新渲染系统中,这使初始组合时间平均提高了 22%,并在一项涉及文本的复杂布局的基准测试中提升高达 70%。
许多文本 API 现已稳定,包括:
TextMeasurer
和相关 API- LineHeightStyle.Alignment(topRatio)
- Brush
- DrawStyle
- TextMotion
- DrawScope.drawText
- Paragraph.paint (brush, drawStyle, blendMode)
- MultiParagraph.paint (brush, drawStyle, blendMode)
- PlatformTextInput
核心功能的改进与问题修复
我们还在核心 API 中推出新功能和改进,并使一些 API 实现稳定:
- LazyStaggeredGrid 现已稳定。
- 添加了 asComposePaint API 以取代 toComposePaint,前者返回的对象对原始 android.graphics.Paint 进行了封装。
- 添加了 IntermediateMeasurePolicy 以支持 SubcomposeLayout 中的先行传递 (Lookahead)。
- 添加了 onInterceptKeyBeforeSoftKeyboard 修饰符以在软键盘之前拦截按键事件。
开始使用!
很感激大家在我们的 问题跟踪页 上提交了错误报告和功能请求,这帮助我们改进了 Compose 并构建您需要的 API。欢迎继续提供反馈,帮助我们打造更好的 Compose!
想知道未来计划?您可以查看我们的 路线图,了解我们目前正在考虑和努力开发的功能。我们热切期待看到您的下一个杰作!
祝您使用 Compose 创作愉快!
版权声明
禁止一切形式的转载-禁止商用-禁止衍生 申请授权