使用 Build Analyzer 排查构建性能问题

您可以使用 Build Analyzer 检查项目的构建性能。 构建性能可能会受多种因素影响,这些因素因具体构建而异。对于您执行的每项构建,Build Analyzer 都会尝试显示最重要的信息,以便您快速找出影响构建性能的回归问题并予以解决。

本页面简要介绍了 Build Analyzer,并就如何使用该工具提升项目的构建性能提供了一些指导。如需了解如何提高构建性能的其他策略,请阅读优化构建速度

分析器显示的数据因具体构建操作而异。特别是在复杂的大型构建操作中,许多因素都会因构建操作而异,这会导致分析器在构建期间作为重要因素呈现给您的数据发生变化。因此,最好多次构建项目并在分析器中对比数据以确定使用何种模式。

开始

在您每次构建应用时,Build Analyzer 都会生成一份报告,并在 Build 窗口中显示最新报告中的数据。

如需开始使用,请按以下步骤操作:

  1. 如果您尚未构建应用,请采用以下其中一种方法构建应用:
    • 从菜单栏中依次点击 Build > Make Project
    • 如需构建 Android App Bundle 或 APK,请从菜单栏中依次点击 Build > Build Bundle(s) / APK(s) > Build Bundle(s)Build > Build Bundle(s) / APK(s) > Build APK(s)
  2. 如需打开 Build 窗口,请从菜单栏中依次选择 View > Tool Windows > Build
  3. 如需在 Build Analyzer 中查看构建报告,请点击 Build 窗口中的 Build Analyzer 标签页。

查看决定着构建时长的任务所属的插件

完成构建后首次打开 Build Analyzer 时,相应窗口会显示构建分析的概览,如图 1 所示。

图 1. Build Analyzer 概览页面提供了结果概要。

如需查看决定着构建时长的任务所属的插件的细分数据,请点击概览页面上的 Plugins with tasks impacting build duration。您也可以从下拉菜单中选择 Tasks 并确认已选中 Group by plugin

图 2. Build Analyzer 显示对构建时长影响最大的插件的详情。

任务窗格会显示为构建时长做出贡献的任务。任何有问题的任务旁边都会显示一个警告图标。

该图表显示了任务在总构建时长中所占的百分比。

详细信息窗格会详细描述针对所选任务已检测到的问题。

每个节点都会显示执行其直属子节点所用的总时长。时长有助于您重点检查对构建时长影响最大的任务。

查看决定着构建时长的任务

如需决定着构建时长的任务的细分数据,请点击概览页面上的 Tasks impacting build duration。您也可以从下拉菜单中选择 Tasks 并确认未选中 Group by plugin

图 3. Build Analyzer 显示对构建时长影响最大的任务的详情。

Gradle 按任务的相互依赖性、项目结构和 CPU 负载来决定任务的执行方式,并按顺序或并行执行任务。对于给定的构建操作,Build Analyzer 会突出显示决定当前构建时长的一组按顺序执行的任务。如需缩短总构建时长,最好首先解决这些突出显示的任务执行效率低下的问题。

对于您执行的每项构建,您可能都会看到一组不同的任务决定着构建时长。例如,如果您对 build 配置进行更改、在运行构建操作时执行一组不同的任务(如增量构建)或在不同的约束条件下运行构建操作,那么“Build Speed”窗口中突出显示的对构建时长影响最大的任务也会有所差异。由于这种差异,建议您执行多项构建并使用“Build Speed”窗口,以便不断缩短构建时长。

所列出的每项任务的颜色编码如下所示:

  • 浅蓝色:相应任务属于 Android Gradle 插件、Java Gradle 插件或 Kotlin Gradle 插件。
  • 蓝色:相应任务属于第三方插件或自定义插件,例如您使用 Android Studio 创建新项目后应用的插件。
  • 紫色:相应任务不属于插件,但用于在运行时动态修改项目属性。例如,您可能会在 build.gradle 文件中指定的任务。
  • 灰色:与分析器突出显示的其他任务相比,相应任务对构建时长影响不大。

您可以点击每项子任务以详细了解其执行情况。分析器还会提供其他详细信息,例如父插件、任务类型、促使此任务运行的其他任务以及相应任务是否以增量方式执行,如图 2 所示。分析器可能还会显示有助于对相应任务进行配置以使其更高效地运行的警告。

检查警告

如果 Build Analyzer 检测到某些任务可以在配置后更高效地运行,则会发出警告。

例如,未使用合适的 Gradle API 来指定输入和输出的任务无法使用增量构建。 如果您的构建操作包含此类任务,Build Analyzer 可能会使用 Always-run 警告对这些任务进行标记,因为每次构建时都必须执行这些任务,无论其输入是否发生变化。

如需查看分析器为您的构建操作标识的所有警告,请点击概览页面上的 All warnings,或从下拉列表中选择 Warnings。 “Warnings”视图会显示按类别分组的警告。例如,Always-run 节点会将分析器认定未针对增量构建正确配置的任务分为一组。

点击某个子节点后,分析器会描述警告的性质以及可解决相应问题的步骤。此外,如果相应任务属于您在项目中应用的某个插件,分析器会提供一个 Generate report 链接,如图 4 所示。

图 4. 有关 Build Analyzer 警告的详细信息。

点击 Generate report 链接后,系统会显示一个对话框,其中包含可能有助于插件开发者解决新版插件中问题的其他信息。点击 Copy 将文本复制到剪贴板,以便更轻松地将信息粘贴到给插件开发者的 bug 报告中。

警告类型

Build Analyzer 会报告以下警告类型:

  • 始终运行任务:始终运行的任务会使其他任务在每个 build 中都运行,这是没有必要的。导致出现此警告有两个主要原因:

    • (较为常见)您没有正确声明任务输入和输出。如果是这种情况,您应该正确声明任务的输入和输出。 这意味着,您应该在可行时自行声明输入和输出,或者在触发警告的任务来自第三方插件时更改插件版本。

    • (不太常见)任务将 upToDateWhen 设置为 false,应该避免这种情况。这可能是因为某些逻辑的评估结果为 false,或者 upToDateWhen 被硬编码为 false。如果存在评估结果为 false 的逻辑,则此结果可能是有意为之,您可以选择忽略警告。如果 upToDateWhen 被硬编码为 false,您应该从代码中取消硬编码。

  • 任务设置问题:声明相同输出目录的任务会生成此警告。这意味着,这些任务输出很可能不会在 build 之间保留,并且这些任务会始终运行,即使没有更改也是如此。若要解决此警告,您应为任务声明不同的输出目录。 这意味着您可以在可行时自行声明不同的输出目录,或者在触发警告的任务来自第三方插件时更改插件版本。

  • 非增量注解处理器:当注解处理器为非增量处理器并导致 JavaCompile 任务始终以非增量方式运行时,系统就会生成此警告。如需解决此警告,请切换到增量注解处理器

  • 配置缓存:如果您的项目未启用配置缓存,系统会显示此警告。Build Analyzer 会挨个检查一系列 build,检查您的项目是否与配置缓存兼容。 如果兼容性检查结果成功,您可以从 Build Analyzer 开启配置缓存。

  • 检查 Jetifier:如果您的项目中存在并启用了 enableJetifier 标记,也就是说,如果您的 gradle.properties 文件具有 android.enableJetifier=true 设置,系统会显示此警告。Build Analyzer 可以执行一项检查,确认是否可以安全移除该标记,使您的项目能够具有更好的构建性能,并不再使用未加维护的 Android 支持库。

查看下载影响

Build Analyzer 提供了下载依赖项所花费的时间摘要,以及每个代码库的下载详情视图。如需查看各项下载内容的影响,请从下拉列表中选择下载内容

您可以使用此信息来确定意外的依赖项下载是否对构建性能产生负面影响。这在增量 build 中尤为重要,增量 build 不应一直下载制品。

具体而言,您可以利用这些信息来识别配置问题,例如使用导致意外下载的动态依赖项。 此外,如果看到某一特定代码库出现大量失败的请求,这可能表示该代码库应该移除或移至代码库配置的更靠下位置。

图 5. Build Analyzer 显示了各项下载内容对构建时长的影响。