比较 Compose 指标和 View 指标

Jetpack Compose 可加快界面开发并改进 Android 开发。但请考虑 将 Compose 添加到现有应用可能会影响相关指标,例如应用的 APK 大小、 构建和运行时性能

APK 大小和构建时间

本部分将介绍对 APK 大小和构建时间的影响,具体方法是查看 Sunflower 示例应用 - 一款演示最佳做法的应用 将基于 View 的应用迁移到 Compose 的过程。

APK 大小

将库添加到项目中会增加其 APK 大小。以下结果 是针对每个项目及其资源和代码的精简版 APK 启用了缩减功能,使用的是 R8 完整模式,并使用 APK 分析器进行衡量。

仅查看 View 和 Compose 混合 仅 Compose
下载大小 2,252 KB 3,034 KB 2,966 KB

首次将 Compose 添加到 Sunflower 时,APK 大小从 2252 KB 增加到了 3034 KB - 增加了 782 KB。生成的 APK 由界面 build 与 并结合使用了 View 和 Compose这属于正常现象 依赖项添加到 Sunflower。

相反,当 Sunflower 迁移到纯 Compose 应用时,APK 大小 从 3034 KB 减少到 2966 KB,减少 68 KB。此减少的原因是 移除未使用的 View 依赖项,例如 AppCompatConstraintLayout

构建时间

添加 Compose 会增加应用作为 Compose 编译器的构建时间 处理应用中的可组合项。使用 独立的 gradle-profiler 工具,它会多次执行构建, 在如下期限内可获取平均构建时间: Sunflower:

gradle-profiler --benchmark --project-dir . :app:assembleDebug
仅查看 View 和 Compose 混合 仅 Compose
平均构建时间 299.47 毫秒 399.09 毫秒 342.16 毫秒

首次将 Compose 添加到 Sunflower 时,平均构建时间从 299 毫秒至 399 毫秒 - 增加 100 毫秒。该时长取决于 Compose 编译器 执行额外的任务来转换项目中定义的 Compose 代码。

相反,当构建时间缩短至 342 毫秒时,缩短了 57 毫秒 Sunflower 已完成向 Compose 的迁移。这种减少可归功于 可共同缩短构建时间的几个因素,如删除数据 绑定、将使用 kapt 的依赖项迁移到 KSP 并更新 更新到其最新版本

摘要

采用 Compose 将有效增加应用的 APK 大小, 由于编译过程,可提高应用的构建时性能 Compose 代码部分。然而,这些利弊需要权衡 Compose 的优势,尤其是在提高开发者工作效率方面的优势 采用 Compose 时需要考虑的方面。例如,Play 商店团队发现 编写界面所需的代码要少得多,有时最多可使用 50%,因此 提高代码的工作效率和可维护性。

如需了解详情,请参阅采用 Compose for Teams

运行时性能

本部分介绍了与 Jetpack Compose 中的运行时性能相关的主题, 有助于了解 Jetpack Compose 与 View 系统性能的对比情况, 以及衡量方法

智能重组

当界面的某些部分无效时,Compose 会尝试仅重组 需要更新的部分有关详情,请参阅 Android Studio 的 可组合项Jetpack Compose 阶段文档。

基准配置文件

基准配置文件是 是加快普通用户体验历程的好方法。包括基准 在应用中设置配置文件可以将代码执行速度从首次启用时提高约 30% 可避免对 API 进行解译和即时 (JIT) 编译步骤 包含的代码路径。

Jetpack Compose 库包含自己的基准配置文件, 当您在应用中使用 Compose 时,系统会自动实现这些优化。不过, 这些优化只会影响 Compose 库中的代码路径,因此我们 建议您将基准配置文件添加到 应用涵盖 Compose 之外的代码路径。

与 View 系统比较

与 View 系统相比,Jetpack Compose 有许多改进。这些改进 具体说明如下。

对 View 进行了全方位扩展

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

Jetpack Compose 通过多种方式解决了此问题。Compose 没有显式声明 用于绘制视图的可更新对象。界面元素是简单的可组合函数 该格式的信息以可重放的方式写入乐曲。这有助于 可以减少显式状态跟踪、内存分配和回调, 可组合项需要上述功能,而不是所有人都需要它们 给定 View 类型的扩展。

此外,Compose 还提供智能重组, 重放之前绘制的结果。

多次布局传递

传统的 ViewGroup 在测量和布局方面具有很多表现力 导致它们容易发生多次布局传递的 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 搭配使用,请参阅 MacrobenchmarkSample 项目

Jetpack Compose 团队还使用 Macrobenchmark 来捕获 可能性。例如,请参阅延迟列的基准 及其信息中心 来跟踪回归问题。

Compose 配置文件安装

由于 Jetpack Compose 是一个未捆绑库,因此它对预加载 View 系统的 界面工具包类和可绘制对象。Jetpack Compose 1.0 利用配置文件 安装。配置文件安装程序可让应用指定关键代码, 在安装时预先 (AOT) 编译。Compose 随附配置文件安装规则,可减少 Compose 应用的启动时间和卡顿。