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

时间:2017-11-19 18:35:59

标签: java android firebase android-gradle firebase-performance

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

Slow Build shown in Profiler

9 个答案:

答案 0 :(得分:32)

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

应用程式:

  

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

根/ buildscript /依赖关系:

  

if(!project.hasProperty(“disable-performance-plugin”)){               classpath('com.google.firebase:firebase-plugins:1.1.5'){                   排除组:'com.google.guava',模块:'guava-jdk5'               }           }

从命令行运行时使用

  

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

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

Android Studio compiler options

答案 1 :(得分:19)

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

要解决此问题,您有2种主要选择。

1。使用firebasePerformanceInstrumentationEnabled属性

这是the official way provided by the SDK本身,用于在构建过程中将其禁用。

这是什么:

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

操作方法:

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

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

尽管如此,我们通常只需要两个步骤:

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

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

      

    ./ gradlew assembleRelease -PfirebasePerformanceInstrumentationEnabled = true

优点:

  • 只能设置一个属性。

缺点:

  • 插件仍然会增加大约5-15秒的构建时间。

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

这是什么:

  • transformClassesWithFirebasePerformancePluginFor *任务根本不执行。此外,当使用第一种解决方案时,我们还节省了大约5-10秒的额外开销。
  • 与第一种方法相同–禁用自动跟踪并请求监视,但保留 custom 跟踪。您可以使用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或更高版本,stated in the docs,则不需要在那里排除guava-jdk5依赖项。

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

      

    ./ gradlew assembleRelease -PuseFirebasePerf

优点:

  • 完全,消除了与Firebase Performance Gradle插件相关的时间开销。

缺点:

  • 介绍了在Gradle脚本中应用插件的条件检查,some might argue并非惯用方法。

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

如果您不使用Firebase Performance 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的大小将比调试一个APK大0.5mb。这可能会扰乱您的报告或预测,因此您需要意识到这一点。
  • 如果您即将超过64K方法计数限制,那么您可能会突然在生产版本上超过它,并进入MultiDex区域。这意味着要做额外的工作并要运行测试。所有这些都是因为Firebase Performance带来了将近5K的方法引用(在应用ProGuard进行优化之后),数量庞大。

您也可以查看my article,在这里我将进一步扩展该主题。

答案 2 :(得分:7)

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

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

答案 3 :(得分:5)

仅提供另一个禁用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'
     }
}

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

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

答案 4 :(得分:3)

我也遇到了这个问题。最初,我们使用的是R.Zagórski提供的答案的变体,但是基于Gradle论坛上的similar thread,看来有条件地将插件应用于项目是不正确的方法:

  

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

如果您能正确执行,则有条件地应用插件似乎确实可以正常工作,但这不是官方支持的功能。在同一线程的更深处,还有另一点:

  

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

果然,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
            }
        }
    }

    ...
}

请注意,完成此操作后,transformClassesWithFirebasePerformancePluginFor*任务将始终针对每个构建变体运行,但是对于未启用检测的变体,它将几乎立即完成。

答案 5 :(得分:2)

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

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

}

对于Groovy版本,您可以签出Firebase documentation

答案 6 :(得分:0)

我简化了此答案https://stackoverflow.com/a/53270530/1635488的选项2

  • gradle.properties中定义属性

    useFirebasePerf = false

  • 禁用性能插件

    if(useFirebasePerf.toBoolean()){     应用插件:“ com.google.firebase.firebase-perf” }

  • 删除依赖项

    if(useFirebasePerf.toBoolean()){     实施'com.google.firebase:firebase-perf:16.2.3' }

  • 仅对CI构建启用性能监视(我建议仅对发布构建启用)

    gradlew assembleRelease -PuseFirebasePerf = true

答案 7 :(得分:0)

Firebase Performance 已发布perf-plugin v1.3.0 )的新版本。这将为特定的构建变体(包括 buildTypes productFlavors 禁用 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
        }
      }
    }

发行说明参考:

https://firebase.google.com/support/release-notes/android#update_-_july_10_2019

答案 8 :(得分:0)

kotlin DSL中更简洁的方式

buildTypes {
   //My custom extension
   forName("debug") {
      roject.ext.set("firebasePerformanceInstrumentationEnabled", "false")
   }
}

forName的实现

fun <T> NamedDomainObjectContainer<T>.forName(name: String, action: T.() -> Unit) {
    this.maybeCreate(name)
    this.getByName(name, object: Action<T>{
        override fun execute(t: T) {
            t.action()
        }
    })
}