Compose 中的开发者工效学设计

Jetpack Compose 可加快界面开发,提高 Android 工程师的工作效率。不过,向项目添加新工具需要注意一些事项,因为这样做可能会影响 APK、构建性能和运行时性能。

APK 大小和构建时间

在本部分中,我们将比较两个不同的应用受到的影响,一个是添加了 Jetpack Compose 的应用,另一个是迁移到 Jetpack Compose 的应用:

  • Tivi 完全迁移到了 Compose,同时移除了 AppCompat 和 Material Design 组件库。
  • Sunflowercompose_recyclerview 分支)添加了 Compose,仅将其用于 RecyclerView 的项。所有其他依赖项都保持不变。

APK 大小

将库添加到项目中会影响 APK 大小。我们来看看 Compose 对上述项目的大小有何影响。以下是 Compose 对每个项目的缩减版 APK 的影响,这些项目启用了资源和代码缩减功能,使用 R8 完整模式。影响的结果使用 APK 分析器进行衡量。

Tivi 的 APK 大小缩减了 46%,从 4.49MB 缩减到 2.39MB。此外,在完全迁移到 Compose 后,使用的方法数量也减少了 17%。XML 代码行减少了 76%。

在将 Compose 添加到项目中后,Sunflower 的 APK 大小增加了 575KB,从 2407KB 增加到 2982KB。由于 Compose 很少会在该 Sunflower 分支中用到,因此该项目并未从“仅使用 Compose 时会缩减 APK 大小”中受益,例如从项目中移除 AppCompat 依赖项。

构建时间

下面我们使用相同的项目来衡量 Compose 对构建性能的影响

这考虑的是调试构建时间,您在开发期间会更关注此时间。

在迁移到 Compose 前,Tivi 的平均构建时间为 108.71 秒。在完全迁移到 Compose 后,平均构建时间缩短至 76.96 秒!构建时间缩短了 29%。构建时间能缩短这么多,在很大程度上受两个因素的影响:一个是能够从使用 kapt 注解处理器的项目中移除数据绑定Epoxy,另一个是 HiltAGP 7.0 中的运行速度更快。

但是,Sunflower 的平均构建时间增加了 7.6%,从 11.57 秒增加到 12.45 秒。

最后总结

开始在应用中采用 Compose 时,您会发现 APK 大小和构建时间有所增加,而在项目完全迁移到 Compose 后,APK 大小和构建时间会减少,并且优于原始指标。

运行时性能

本部分介绍了与 Jetpack Compose 中的运行时性能相关的主题,以便您了解与 View 系统相比,Jetpack Compose 的性能如何,以及如何衡量性能。

智能重组

如果界面的某些部分无效,Compose 会尽力只重组需要更新的部分。如需详细了解此主题,请参阅可组合项的生命周期指南。

与 View 系统比较

Jetpack Compose 不仅具有设计上的优势,而且从 View 系统汲取了经验教训,因此其性能要优于 View 系统。

对 View 进行了全方位扩展

在屏幕上绘制的每个 View(例如 TextViewButtonImageView)都需要内存分配、显式状态跟踪和各种回调,才能支持所有用例。此外,自定义 View 所有者需要实现显式逻辑,以防止在非必要情况下(例如,重复数据处理)重新绘制。

Jetpack Compose 通过多种方式解决了此问题。Compose 中没有用于绘制 View 的显式可更新对象,界面元素是简单的可组合函数,这些函数的信息以可重放的方式写入组合。这有助于将显式状态跟踪、内存分配以及回调缩减为仅对需要上述功能的可组合项执行,而不是对给定 View 类型的所有扩展都执行。

此外,Compose 还提供了开箱即用的智能重组功能,可在无需进行任何更改的情况下重放之前绘制的结果。

多次布局传递

传统的 ViewGroup 在性能衡量 API 和布局 API 方面有诸多表现形式,因此很容易导致发生多次布局传递。如果在视图层次结构中的特定嵌套点进行了多次布局传递,可能会导致工作量呈指数级增长。

Jetpack Compose 通过其 API 协定为所有布局可组合项强制执行单次布局传递。这使 Compose 能够高效地处理较深的界面树。如果需要进行多次测量,Compose 具有一个特殊系统,即固有特性测量

View 启动性能

首次显示特定布局时,View 系统需要膨胀 XML 布局,Jetpack Compose 则节省了此开销,因为布局是使用 Kotlin 编写的,并像应用的其余部分一样进行编译。

对 Compose 进行基准化分析

在 Jetpack Compose 1.0 中,应用在 debugrelease 模式下的性能存在显著差异。为使得出的时间结果具有代表性,在对应用进行性能分析时,请始终使用 release build(而非 debug)。

如需了解 Jetpack Compose 代码的性能,您可以使用 Jetpack Macrobenchmark 库。Jetpack Compose 团队也使用该库来捕获可能发生的任何回归问题。例如,请查看此 lazy 列的基准及其信息中心,以跟踪回归问题。

Compose 配置文件安装

由于 Jetpack Compose 是未捆绑库,因此它无法受益于 Zygote,后者会预加载 View 系统的界面工具包类和可绘制对象。Jetpack Compose 1.0 利用了 release build 的配置文件安装ProfileInstaller 可让应用指定要在安装时进行 AOT 编译的关键代码。Compose 随附配置文件安装规则,可减少 Compose 应用的启动时间和卡顿。