查看原文
其他

Jetpack Compose 2023 年 8 月版最新动态

Android Android 开发者 2023-11-14

作者 / Android 开发者关系工程师 Ben Trengrove 


我们在 Compose 2023 年 8 月物料清单 (BoM) 中发布了 Jetpack Compose 1.5 版本。Jetpack Compose 是 Android 现代原生界面工具包,已经被 Google Play 商店、Dropbox Airbnb 等应用采用。此版本主要侧重于性能改进,因为我们从 2022 年 10 月版本开始的修饰符重构工作的主要部分现已完成合并。


  • Compose 2023 年 8 月物料清单 (BoM)

    https://developer.android.google.cn/jetpack/androidx/releases/compose

  • Jetpack Compose

    https://developer.android.google.cn/jetpack/compose

  • 已经被众多应用采用

    https://developer.android.google.cn/jetpack/compose#apps-built-with-compose

  • Google Play 商店

    https://android-developers.googleblog.com/2022/03/play-time-with-jetpack-compose.html

  • Airbnb

    https://android-developers.googleblog.com/2022/05/airbnb-uses-jetpack-compose.html

  • 修饰符重构

    https://www.youtube.com/watch?v=BjGX2RftXsU



性能



当我们于 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、级别较低的焦点修饰符、paddingoffset。这些低级别修饰符不仅用于 Clickable 等其他常用修饰符,还用于 Text 等许多框架可组合项。在 2023 年 3 月版本中,迁移修饰符已为这些组件带来性能提升,但当我们将更高等级的修饰符和可组合项本身迁移到新修饰符系统时,真正的优势才得以体现。


  • Compose 界面
    https://developer.android.com/jetpack/androidx/releases/compose-ui

  • Compose Foundation
    https://developer.android.google.cn/jetpack/androidx/releases/compose-foundation


在 2023 年 8 月版本中,我们已开始将 Clickable 修饰符迁移至新修饰符系统,从而显著改善组合时间,在某些情况下改善幅度高达 80%。在包含可点击元素 (如按钮) 的惰性列表中,这一点尤为重要。Clickable 所使用的 Modifier.indication 仍在迁移中,因此我们预计未来的版本中还会有进一步更新。


  • 迁移
    https://android-review.googlesource.com/c/platform/frameworks/support/+/2528040

  • Jetpack WindowManager
    https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Indication.kt;l=104


在迁移工作中,我们发现了一个未参与原始重构过程的组合修饰符的用例,并添加了新 API 来创建使用 CompositionLocal 实例的 Modifier.Node 元素。


  • 新 API

    https://android-review.googlesource.com/c/platform/frameworks/support/+/2318839


我们正在编写文档,帮助您将自己的修饰符迁移至新的 Modifier.Node API。您可以参考我们代码库中的示例,立即开始迁移。


  • 我们代码库中的示例

    https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierSamples.kt


如需详细了解上述更改背后的原理,您可以观看 2022 年 Android 开发者峰会的 "Compose 修饰符深度探讨" 演讲视频。



内存



此版本包含内存使用方面的一些改进。我们已仔细研究发生在不同 Compose API 间的分配,并减少了一些区域的总体分配,尤其是在图形堆栈和矢量资源加载方面。这不仅减少了 Compose 的内存占用,还直接提升了性能,因为我们在分配内存花费的时间减少了,也减少了垃圾收集。

此外,我们还修复了一个在使用 ComposeView 时出现的内存泄漏问题。修复后,所有应用,尤其是使用多 Activity 架构或大量 View/Compose 互操作性功能的应用将从中受益。


  • 内存泄漏

    https://issuetracker.google.com/240975572



文本



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

  • LineHeightStyle.Alignment(topRatio)
    https://android-review.googlesource.com/c/platform/frameworks/support/+/2485834

  • Brush, DrawStyle, TextMotion, DrawScope.drawText, Paragraph.paint (brush, drawStyle, blendMode), MultiParagraph.paint (brush, drawStyle, blendMode)

    https://android-review.googlesource.com/c/platform/frameworks/support/+/2550856

  • PlatformTextInput

    https://android-review.googlesource.com/c/platform/frameworks/support/+/2465156



核心功能的改进与问题修复



我们还在核心 API 中推出新功能和改进,并使一些 API 实现稳定: 


  • LazyStaggeredGrid 现已稳定。
  • 添加了 asComposePaint API 以取代 toComposePaint,前者返回的对象对原始 android.graphics.Paint 进行了封装。
  • 添加了 IntermediateMeasurePolicy 以支持 SubcomposeLayout 中的先行传递 (Lookahead)。
  • 添加了 onInterceptKeyBeforeSoftKeyboard 修饰符以在软键盘之前拦截按键事件。


  • IntermediateMeasurePolicy

    https://cs.android.com/androidx/platform/tools/dokka-devsite-plugin/+/master:testData/compose/samples/ui/samples/SubcomposeLayoutSample.kt;l=56

  • onInterceptKeyBeforeSoftKeyboard
    https://android-review.googlesource.com/c/platform/frameworks/support/+/2480419



开始使用!



很感激大家在我们的问题跟踪页上提交了错误报告和功能请求,这帮助我们改进了 Compose 并构建您需要的 API。欢迎继续提供反馈,帮助我们打造更好的 Compose!

  • 问题跟踪页

    https://issuetracker.google.com/issues/new?component=612128


想知道未来计划?您可以查看我们的路线图,了解我们目前正在考虑和努力开发的功能。我们热切期待看到您的下一个杰作!


  • 路线图

    httphttps://developer.android.google.cn/jetpack/androidx/compose-roadmap


祝您使用 Compose 创作愉快!欢迎您持续关注 "Android 开发者" 微信公众号,及时了解更多开发技术和产品更新等资讯动态。



推荐阅读

如页面未加载,请刷新重试

 点击屏末 | 阅读原文 | 即刻了解 Compose 更多内容




继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存