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

问题描述 投票:18回答:6

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

Slow Build shown in Profiler

java android firebase android-gradle firebase-performance
6个回答
34
投票

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

应用:

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

根/ buildscript /依赖关系:

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 -Papable-performance-plugin

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

Android Studio compiler options


22
投票

所有现有的答案都是有效的,但他们都错过了一些东西。

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

1. Use firebasePerformanceInstrumentationEnabled property

这是the official way provided by the SDK本身在构建过程中禁用它。

这是做什么的:

  • transformClassesWithFirebasePerformancePluginFor*任务执行时间减少到约5-10秒。
  • 禁用自动跟踪和请求监视,但启用自定义跟踪。您可以使用AndroidManifest <meta-data>标记控制后者并调用FirebasePerformance.getInstance().setPerformanceCollectionEnabled()。更多信息在the docs

这该怎么做:

我认为只在我们需要它的情况下启用插件时更容易(通常只有在我们发布应用程序时才会这样)而不是在所有其他情况下禁用插件。

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

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

  1. 将以下行添加到gradle.properties文件中: firebasePerformanceInstrumentationEnabled=false
  2. 在CI配置或手动构建中使用以下命令: ./gradlew assembleRelease -PfirebasePerformanceInstrumentationEnabled = true

优点:

  • 只有一个属性可以设置。

缺点:

  • 插件仍然会在构建时添加额外的~5-15秒。

2. Use custom Gradle project property to avoid applying firebase-perf Gradle plugin

这是做什么的:

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

这该怎么做:

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

  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-plugins v1.1.1或更高版本作为guava-jdk5,你不需要在那里排除stated in the docs依赖。
  2. 在CI配置或手动构建中使用以下命令: ./gradlew assembleRelease -PuseFirebasePerf

优点:

  • 完全消除与Firebase Performance Gradle插件相关的时间费用。

缺点:

  • 介绍在Gradle脚本中应用插件的条件检查,some might argue认为这不是惯用的方法。

* (Bonus option) Use custom Gradle project property to exclude firebase-perf SDK

如果您不使用Firebase Performance SDK中的自定义跟踪或任何其他功能,并且仅依赖于自动监视(即,您的代码中没有任何依赖于SDK),那么您可以将非依赖性排除在非生产中建立。

这该怎么做:

您需要做的就是更新您的app模块qazxsw poi文件:

  • 如果您选择使用第一个选项,则更改您的依赖关系,如下所示: build.gradle
  • 如果您选择第二个: if (project.property('firebasePerformanceInstrumentationEnabled') == 'true') { implementation "com.google.firebase:firebase-perf:${firebase_perf_version}" }

优点:

  • 这可能会为您节省额外的约5-10秒,用于配置依赖关系和“ProGuarding”它。

缺点:

  • 您的制作APK尺寸将大于调试一个~0.5mb。这可能会破坏您的报告或预测,因此您需要了解它。
  • 如果您接近超过64K方法计数限制,您可能会突然在生产版本上跳过它并发现自己在MultiDex区域。这意味着需要做额外的工作和运行测试。所有这些都是因为Firebase Performance带来了令人敬畏的近5K方法引用(在使用ProGuard进行优化之后)。

您还可以查看if (project.hasProperty('useFirebasePerf')) { implementation "com.google.firebase:firebase-perf:${firebase_perf_version}" } ,我在这个主题上进一步扩展。


9
投票

此主题中的所有注释均有效。我想建议一种非常简单的方法来禁用调试版本:

my article

5
投票

只是给另一个选项来禁用if (getGradle().getStartParameter().getTaskRequests().toString().contains("Release")) { apply plugin: 'com.google.firebase.firebase-perf' } ,这是我的食谱:

在main build.gradle文件夹中:

transformClassesWithFirebasePerformancePluginForDebug

在build.gradle应用程序文件中:

if (!project.gradle.startParameter.taskNames.any { taskName ->
     taskName.toLowerCase().contains('assemble') && taskName.toLowerCase().contains('debug') }) {
     classpath("com.google.firebase:firebase-plugins:$firebasePluginVersion") {
         exclude group: 'com.google.guava', module: 'guava-jdk5'
     }
}

3
投票

我也遇到了这个问题。最初我们一直在使用R.Zagórski提供的答案的变体,但基于Gradle论坛的if (!project.gradle.startParameter.taskNames.any { taskName -> taskName.toLowerCase().contains('assemble') && taskName.toLowerCase().contains('debug') }) { apply plugin: 'com.google.firebase.firebase-perf' } ,似乎有条件地将插件应用于项目并不是正确的方法:

插件不能仅应用于“项目的一部分”。它们是否适用。

有条件地应用插件似乎可以正常工作,但它不是官方支持的功能。在同一个线程中,另一个点是:

但是插件应该允许您以更细粒度的级别配置它。

果然,Firebase插件实际上有一个属性可以让你打开或关闭仪器(因此切换增加的构建时间)。但是,使用这个属性是很棘手的,因为你必须在构建过程中的恰当时间应用它,但是一旦你有了它,那么你基本上可以根据你的需要进行调整。

以下代码片段是我们如何基于Debug与非Debug构建变​​体来轮换检测。它是用Kotlin编写的,但我想它也会转换为Groovy:

similar thread

请注意,有了这个,plugins { ... id ("com.google.firebase.firebase-perf") } ... android { ... applicationVariants.all { val variant = this val isFirebaseEnabled = !variant.javaCompiler.name.contains("Debug", true) gradle.taskGraph.whenReady { if (this.hasTask(variant.javaCompiler)) { project.FirebasePerformance.isInstrumentationEnabled = isFirebaseEnabled } } } ... } 任务仍将始终针对每个构建变体运行,但对于未启用检测的变体,它几乎会立即完成。


0
投票

我简化了这个答案transformClassesWithFirebasePerformancePluginFor*的选项2

  • https://stackoverflow.com/a/53270530/1635488中定义一个属性 useFirebasePerf = FALSE
  • 禁用perf插件 if(useFirebasePerf.toBoolean()){apply plugin:'com.google.firebase.firebase-perf'}
  • 删除依赖 if(useFirebasePerf.toBoolean()){implementation'com.google.firebase:firebase-perf:16.2.3'}
  • 仅为CI构建启用性能监视(我建议仅针对发布版本) gradlew assembleRelease -PuseFirebasePerf = true

0
投票

Firebase Performance发布了新版本的gradle.properties(v1.3.0)。这样可以为特定的构建变体(包括buildTypes或productFlavors)禁用Firebase性能监视Gradle插件。

以下示例:

perf-plugin

参考发行说明:

android { // ... debug { FirebasePerformance { // Set this flag to 'false' to disable @AddTrace annotation processing and // automatic HTTP/S network request monitoring // for a specific build variant at compile time. instrumentationEnabled false } } }

© www.soinside.com 2019 - 2024. All rights reserved.