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

Ian*_*ite 21 java android firebase android-gradle-plugin firebase-performance

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

Profiler中显示的慢速构建

小智 38

我们项目中的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编译器选项


小智 26

Firebase Performance已发布perf-plugin( v1.3.0 )的新版本。这将启用针对特定构建变体(包括buildTypesproductFlavors禁用Firebase Performance Monitoring Gradle 插件。

下面是一个例子:

 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
        }
      }
    }
Run Code Online (Sandbox Code Playgroud)

参考发行说明:

https://firebase.google.com/support/release-notes/android#2019-07-10

  • 使用此解决方案,gradle 同步失败,并显示“错误:无法找到参数 [...] 的方法 FirebasePerformance()”。perf-plugin 是 v1.3.1。以及 firebase-perf:18.0.1 或 firebase-perf:19.0.0。我将配置粘贴到 android -> buildTypes -> debug 中。Android Studio版本是3.4.2。还有其他人有同样的问题吗? (4认同)

qwe*_*ger 25

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

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

1.使用firebasePerformanceInstrumentationEnabled财产

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

这是做什么的:

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

优点:

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

缺点:

  • 不完全禁用性能监视(如果这是你想要的).
  • 插件仍然会在构建时添加额外的~5-15秒.

这该怎么做:

我认为在我们需要的时候才能在极少数情况下启用插件(通常只有在我们发布应用程序时才会这样),而不是在所有其他情况下禁用插件.
注意:当然,使用手动构建可能会忘记启用它.因此,如果您没有CI,也许值得在Gradle中添加一些其他自动脚本,或者坚持使用其他答案中使用的相反方法.

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

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

    firebasePerformanceInstrumentationEnabled=false
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在CI配置或手动构建中使用以下命令:

    ./gradlew assembleRelease -PfirebasePerformanceInstrumentationEnabled = true

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

这是做什么的:

  • 完全删除<meta-data>任务以及使用第一个解决方案时存在的额外约5-10个开销.
  • 与第一种方法相同 - 禁用自动跟踪和请求监视,但启用自定义跟踪.您可以使用AndroidManifest FirebasePerformance.getInstance().setPerformanceCollectionEnabled()标签和调用来控制后者build.gradle.更多信息在文档中.

优点:

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

缺点:

  • 介绍在Gradle脚本中应用插件的条件检查,有些人可能会认为这不是惯用的方法.
  • 同样,不会完全禁用性能监控(如果这是你想要的).

这该怎么做:

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

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

    if (project.hasProperty('useFirebasePerf')) {
      apply plugin: 'com.google.firebase.firebase-perf'
    }
    
    Run Code Online (Sandbox Code Playgroud)

    注意:不需要对项目级别应用相同的检查guava-jdk5:

    classpath "com.google.firebase:firebase-plugins:$firebase_plugins_version"
    
    Run Code Online (Sandbox Code Playgroud)

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

    而你并不需要排除firebase-perf依赖那里,如果你使用的火力点,插件V1.1.1或更高版本作为在文档中阐明.

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

    ./gradlew assembleRelease -PuseFirebasePerf

3.(附加)使用自定义Gradle项目属性排除build.gradleSDK

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

优点:

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

缺点:

  • 如果你仔细测量你的APK大小,你会突然看到增加大约0.4mb.这可能会破坏您的报告或预测,因此您需要了解它.
  • 此外,如果您接近超过64K方法计数限制,您可能会突然跳过它,看到您的构建失败并发现自己在MultiDex区域需要另外实现它并测试您的应用程序.所有这些都是因为Firebase Performance带来了令人生畏的近5K方法引用(在使用ProGuard进行优化之后).

这该怎么做:

您需要做的就是更新您的应用模块的firebasePerformanceInstrumentationEnabled文件:

  • 如果您选择使用第一个选项,则更改您的依赖关系,如下所示:

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

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


Rom*_*iel 11

该线程中的所有注释均有效。我想提出一种非常简单的方法来禁用调试版本:

if (getGradle().getStartParameter().getTaskRequests().toString().contains("Release")) {
    apply plugin: 'com.google.firebase.firebase-perf'
}
Run Code Online (Sandbox Code Playgroud)


R. *_*ski 5

只是给另一个选项禁用transformClassesWithFirebasePerformancePluginForDebug,这是我的食谱:

在main 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'
     }
}
Run Code Online (Sandbox Code Playgroud)

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

if (!project.gradle.startParameter.taskNames.any { taskName ->
    taskName.toLowerCase().contains('assemble') && taskName.toLowerCase().contains('debug') }) {
    apply plugin: 'com.google.firebase.firebase-perf'
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为[版本说明](https://firebase.google.com/docs/perf-mon/get-started-android#known_issues)在v1.1.1或更高版本中不需要排除Guava。另外,没有必要在类路径声明中添加条件语句。如果您不应用插件,Gradle将不会以任何方式使用它。 (2认同)

小智 5

我也遇到了这个问题。最初我们一直在使用 R. Zagórski 提供的答案的变体,但基于来自 Gradle 论坛的类似主题,似乎有条件地将插件应用于项目并不是正确的方法:

插件不能仅应用于“项目的一部分”。它们要么被应用,要么不被应用。

如果你能做对,有条件地应用插件似乎确实有效,但这不是官方支持的功能。在同一个线程的更深处,提出了另一点:

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

果然,实际上 Firebase 插件公开了一个属性,可让您打开或关闭检测(因此切换增加的构建时间)。但是,使用此属性很棘手,因为您必须在构建过程中的正确时间应用它,但是一旦获得了该属性,那么您基本上可以根据需要对其进行调整。

以下代码片段是我们如何根据调试与非调试构建变体来旋转检测。它是用 Kotlin 编写的,但我想它也可以转换为 Groovy:

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
            }
        }
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,有了这个,该transformClassesWithFirebasePerformancePluginFor*任务仍将始终针对每个构建变体运行,但对于未启用检测的变体,它几乎会立即完成。

  • 这是一个不错的选择。但是,使用 `firebasePerformanceInstrumentationEnabled=false` 属性的构建仍然比禁用 firebase-perf 插件的构建慢 5-15 秒。 (4认同)

cod*_*rer 5

对于1.3.0带有 Kotlin DSL 的较新版本的 Firebase perf 插件(及更高版本),您需要添加以下内容:

android {
  ...
  buildTypes {
    ...
    all {   
      with((this as ExtensionAware).extensions["FirebasePerformance"] as FirebasePerfExtension) {
        setInstrumentationEnabled(!isDebuggable)
      }     
    }
    ...
  }

}
Run Code Online (Sandbox Code Playgroud)

对于 Groovy 版本,您可以查看Firebase 文档


yca*_*not 5

我认为最清晰的方法是使用 kotlin DSL gradle

在应用程序级别 build.gradle

buildTypes {
        getByName(BuildType.DEBUG) {
            extensions.configure<com.google.firebase.perf.plugin.FirebasePerfExtension>{
                setInstrumentationEnabled(false)
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

在依赖部分:

dependencies {
    releaseImplementation(Dependencies.FIREBASE_PERFORMANCE) //implementation for only release mode (you can vary for other variants)
}
Run Code Online (Sandbox Code Playgroud)