Firebase 性能插件导致构建时间变慢

在 Android Studio 中使用 Firebase Performance 时,gradle 任务花费的时间明显长于任何其他任务,因此大大减慢了我的 gradle 构建时间。app:transformClassesWithFirebasePerformancePluginForDebug

“探查器”中显示的“缓慢构建”


答案 1

我们项目中的 Firebase 导致构建时间增加了 40%。为了加快调试版本的速度,我们添加了一种使用 app/build.gradle 和 root build.gradle 文件中的构建参数打开/关闭它的可能性:

应用程序:

if (!project.hasProperty("disable-performance-plugin"))  {
    apply plugin: 'com.google.firebase.firebase-perf' 
}

根/构建脚本/依赖项:

if (!project.hasProperty("disable-performance-plugin")) {
    classpath('com.google.firebase:firebase-plugins:1.1.5') {
        exclude group: 'com.google.guava', module: 'guava-jdk5'
    }
}

从命令行运行时,请使用

./gradlew your-task  -Pdisable-performance-plugin

在 Android Studio 工作时,将标志添加到编译器选项中:

Android Studio compiler options


答案 2

所有现有的答案都是有效的,但它们都遗漏了一些东西。

要解决此问题,您有2个主要选项可供选择。

1. 使用属性firebasePerformanceInstrumentationEnabled

这是 SDK 本身提供的在构建过程中禁用它的官方方式。

这有什么作用:

  • 将任务执行时间减少到约 5-10 秒transformClassesWithFirebasePerformancePluginFor*
  • 禁用自动跟踪和请求监视,但使自定义跟踪保持启用状态。您可以使用 AndroidManifest 标签和调用 来控制后者。有关详细信息,请参阅文档<meta-data>FirebasePerformance.getInstance().setPerformanceCollectionEnabled()

如何执行此操作:

我认为仅在我们需要的极少数情况下启用插件要容易得多(通常仅在我们发布应用程序时才启用插件),而不是在所有其他情况下禁用它。

注意:当然,对于手动构建,您可能会忘记启用它。因此,如果您没有CI,则可能值得在Gradle中添加一些其他自动脚本,或者坚持使用其他答案中使用的相反方法。

但总的来说,我们只需要两个步骤:

  1. 将以下行添加到文件中:gradle.properties

    firebasePerformanceInstrumentationEnabled=false
    
  2. 在 CI 配置或手动生成中使用以下命令:

    ./gradlew assembleRelease -PfirebasePerformanceInstrumentationEnabled=true

优点:

  • 只需设置一个属性。

缺点:

  • 插件仍然在构建时间上增加了大约5-15秒。

2. 使用自定义 Gradle 项目属性来避免应用 Gradle 插件firebase-perf

这有什么作用:

  • transformClassesWithFirebasePerformancePluginFor* 任务根本不执行。此外,我们还节省了使用第一个解决方案时存在的额外约5-10s开销。
  • 与第一种方法相同 – 禁用自动跟踪和请求监视,但启用自定义跟踪。您可以使用 AndroidManifest 标签和调用 来控制后者。有关详细信息,请参阅文档<meta-data>FirebasePerformance.getInstance().setPerformanceCollectionEnabled()

如何执行此操作:

此方法具有类似的要点和警告,还包括两个步骤:

  1. 修改应用模块的文件:build.gradle

    if (project.hasProperty('useFirebasePerf')) {
      apply plugin: 'com.google.firebase.firebase-perf'
    }
    

    注意:不需要将相同的检查应用于项目级别:build.gradle

    classpath "com.google.firebase:firebase-plugins:$firebase_plugins_version"
    

    当插件本身未启用时,Gradle不会以任何方式使用此声明。

    而且,如果您使用的是firebase插件v1.1.1或更高版本,则无需在此处排除依赖项,如文档中所述guava-jdk5

  2. 在 CI 配置或手动生成中使用以下命令:

    ./gradlew assembleRelease -PuseFirebasePerf

优点:

  • 完全消除了与 Firebase Performance Gradle 插件相关的时间支出。

缺点:

* (奖励选项)使用自定义 Gradle 项目属性排除 SDKfirebase-perf

如果您不使用 Firebase 性能 SDK 中的自定义跟踪或任何其他功能,而仅依赖于自动监控(即,您的代码中没有任何依赖 SDK),则可以为非生产构建排除此依赖项。

如何执行此操作:

您需要做的就是更新应用程序模块的文件:build.gradle

  • 如果您选择使用第一个选项,请按如下方式更改依赖项:

    if (project.property('firebasePerformanceInstrumentationEnabled') == 'true') {
      implementation "com.google.firebase:firebase-perf:${firebase_perf_version}"
    }
    
  • 如果您选择了第二个:

    if (project.hasProperty('useFirebasePerf')) {
      implementation "com.google.firebase:firebase-perf:${firebase_perf_version}"
    }
    

优势:

  • 这可能会为您节省一些额外的~5-10s,用于配置依赖项和“ProGuarding”它。

缺点:

  • 您的正式版 APK 大小将比调试大 0.5mb。这可能会中断您的报告或预测,因此您需要注意这一点。
  • 如果您接近超过64K方法计数限制,您可能会在生产版本中突然超过它,并发现自己处于MultiDex区域。这意味着要做额外的工作和运行测试。这一切都是因为 Firebase Performance 带来了大量近 5K 方法引用(在应用 ProGuard 进行优化后)。

您还可以查看我的文章,其中我对这个主题进行了更多扩展。


推荐