使用 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 呈现的数据可能会因 build 而异,因此建议您多次构建项目并比较数据以确定模式。

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

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

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

如需查看决定着构建时长的任务所属的插件的细分数据,请点击概览页面上的 Plugins with tasks impacting build duration。您也可以从下拉菜单中选择 Tasks 并确认您要按插件分组。该图表按照插件及其相关任务的完成总时间对插件及其相关任务进行排序。

图 2. Build Analyzer 显示影响构建时长的插件的详细信息。

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

如需查看影响构建时长的任务的细分数据,请点击概览页面上的 Tasks impacting build duration,或从下拉列表中选择 Tasks。如果您的项目使用 AGP 8.0 或更高版本,默认情况下,任务会按类别分组,以便更轻松地识别影响构建时长的区域。点击每项子任务可详细了解其执行情况。

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

检查警告

如果 Build Analyzer 检测到某些任务可以配置为更高效地运行,则会发出警告。如需查看 Build Analyzer 为构建识别的所有警告,请点击概览页面上的 All warnings,或从下拉列表中选择 Warnings

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

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

警告类型

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 提供了下载依赖项所花费的时间摘要,以及每个代码库的下载详情视图。如需查看各项下载内容的影响,请从下拉列表中选择下载内容Sync 窗口中也提供了此信息。

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

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

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

[仅限 Windows] 查看杀毒软件的影响

Build Analyzer 会告知您防病毒软件是否可能会影响 build 性能。如果杀毒软件(如 Windows Defender)对 Gradle 使用的目录进行实时扫描,就可能发生这种情况。Build Analyzer 会推荐一系列要从主动扫描中排除的目录,如果可能,还会提供一个链接,供您将这些目录添加到 Windows Defender 文件夹排除列表中。