Firebase Performance Plugin вызывает медленное время сборки

При использовании Firebase Performance в Android Studio app:transformClassesWithFirebasePerformancePluginForDebug Gradle Task app:transformClassesWithFirebasePerformancePluginForDebug занимает значительно больше времени, чем любая другая задача, и, следовательно, значительно замедляет время сборки Gradle.

Медленная сборка отображается в профилировщике

Ответ 1

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

при работе с Android Studio добавьте флаг в параметры компилятора:

Android Studio compiler options

Ответ 2

Все существующие ответы действительны, но все они что-то упускают.

Для решения этой проблемы у вас есть 2 основных варианта на выбор.

1. Используйте свойство firebasePerformanceInstrumentationEnabled

Это официальный способ, предоставляемый самим SDK, чтобы отключить его во время процесса сборки.

Что это делает:

  • Сокращает время выполнения задачи transformClassesWithFirebasePerformancePluginFor* до ~ 5-10 с.
  • Отключает автоматические трассировки и мониторинг запросов, но оставляет включенными настраиваемые трассировки. Вы можете управлять последними с помощью тегов <meta-data> AndroidManifest и FirebasePerformance.getInstance().setPerformanceCollectionEnabled(). Больше информации в документации.

Как это сделать:

Я думаю, что гораздо проще включить плагин только в тех редких случаях, когда он нам нужен (обычно это будет только при публикации приложения), а не отключать его во всех других случаях.

Примечание. Конечно, при сборке вручную вы можете забыть включить ее. Поэтому, если у вас нет CI, возможно, стоит добавить некоторые другие автоматические сценарии в Gradle или придерживаться противоположного подхода, который используется в других ответах.

В общем, нам нужно только два шага:

  1. Добавьте следующую строку в файл gradle.properties:

    firebasePerformanceInstrumentationEnabled=false
    
  2. Используйте следующую команду в конфигурации CI или в сборках вручную:

    ./gradlew assemblyRelease -PfirebasePerformanceInstrumentationEnabled = true

Плюсы:

  • Только одно свойство для настройки.

Минусы:

  • Плагин все еще добавляет дополнительные 5-15 секунд к времени сборки.

2. Используйте пользовательское свойство проекта Gradle, чтобы не применять плагин firebase-perf Gradle.

Что это делает:

  • Задача transformClassesWithFirebasePerformancePluginFor * не выполняется вообще. Также мы экономим некоторые дополнительные ~ 5–10 с накладные расходы, которые присутствуют при использовании первого решения.
  • То же, что и в первом методе - отключает автоматические трассировки и мониторинг запросов, но оставляет включенными настраиваемые трассировки. Вы можете управлять последними с помощью тегов <meta-data> AndroidManifest и FirebasePerformance.getInstance().setPerformanceCollectionEnabled(). Больше информации в документации.

Как это сделать:

Этот подход имеет аналогичные пункты и предупреждения, а также включает в себя два этапа:

  1. Измените файл вашего модуля build.gradle модуля build.gradle:

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

    Примечание: вам не нужно применять ту же проверку к вашему build.gradle уровня build.gradle:

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

    Это объявление никак не будет использоваться Gradle, если сам плагин не включен.

    И вам не нужно исключать зависимость guava-jdk5, если вы используете firebase-plugins v1.1.1 или новее, как указано в документации.

  2. Используйте следующую команду в конфигурации CI или в сборках вручную:

    ./gradlew AssemblyRelease -PuseFirebasePerf

Плюсы:

  • Полностью устраняет временные затраты, связанные с плагином Firebase Performance Gradle.

Минусы:

* (Бонусная опция) Используйте пользовательское свойство проекта Gradle, чтобы исключить firebase-perf SDK

Если вы не используете пользовательские трассировки или какие-либо другие функции из Firebase Performance SDK и полагаетесь только на автоматический мониторинг (то есть у вас нет никаких зависимостей от SDK в вашем коде), то вы можете исключить эту зависимость для непроизводственного использования. строит.

Как это сделать:

Все, что вам нужно сделать, это обновить файл build.gradle модуля 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-10 секунд, потраченных на настройку зависимости и ее "ProGuarding".

Недостатки:

  • Размер вашего рабочего APK будет больше, чем отладочный, примерно на 0,5 Мб. Это может нарушить ваши отчеты или прогнозы, поэтому вы должны знать об этом.
  • Если вы были близки к превышению лимита количества методов в 64 КБ, вы могли бы неожиданно перешагнуть его на производственных сборках и оказаться в зоне MultiDex. А это означает, что нужно выполнить дополнительную работу и запустить тесты. Все потому, что Firebase Performance приносит огромное количество почти 5K ссылок на методы (после применения ProGuard с оптимизацией).

Вы также можете ознакомиться с моей статьей, в которой я немного подробнее расскажу об этой теме.

Ответ 3

Все комментарии в этой теме действительны. Я хочу предложить очень простой способ отключить его для отладочных сборок:

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

Ответ 4

Просто чтобы дать другой вариант отключить 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'
}

Ответ 5

Я столкнулся с этой проблемой также. Первоначально мы использовали вариант ответа, предоставленный Р. Загорским, но, основываясь на аналогичной теме на форумах Gradle, кажется, что условное применение плагина к проекту - неправильный путь:

Плагины не могут быть применены только к "части вашего проекта". Они либо применяются, либо нет.

Условное применение плагинов действительно работает, если вы можете сделать это правильно, но это не официально поддерживаемая функция. Далее по той же теме делается еще одно замечание:

Но плагин должен позволить вам настроить его на более мелком уровне.

Конечно же, на самом деле есть свойство, предоставляемое плагином Firebase, которое позволяет включать и выключать инструментарий (следовательно, переключать увеличенное время сборки). Однако использовать это свойство сложно, так как вы должны применять его точно в нужное время во время процесса сборки, но как только вы его получите, вы можете по существу повернуть его на все, что захотите.

Следующий фрагмент кода показывает, как мы разворачиваем инструментарий, основанный на вариантах сборки Debug и Non-Debug. Это написано на 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* будет по-прежнему всегда выполняться для каждого варианта сборки, но она будет выполнена почти сразу для варианта, для которого не включена инструментарий.

Ответ 6

Firebase Performance выпустила новую версию perf-plugin (v1.3.0). Это позволит отключить подключаемый модуль Firebase Performance Monitoring Gradle для определенного варианта сборки (включая buildTypes или productFlavors).

Пример ниже:

 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

Ответ 7

Я нахожу, когда Android Studio начинает принимать возраст, чтобы построить свое время, чтобы закрыть Android Studio и событие порой мой компьютер и перезагрузиться. Лучше - попробуйте ли вы перезапустить?

Ответ 8

Я упростил вариант 2 этого ответа fooobar.com/questions/1689536/...

  • Определите свойство в gradle.properties

    useFirebasePerf = ложь

  • Отключить плагин

    if (useFirebasePerf.toBoolean()) {применить плагин: 'com.google.firebase.firebase-perf'}

  • Удалить зависимость

    if (useFirebasePerf.toBoolean()) {реализация 'com.google.firebase: firebase-perf: 16.2.3'}

  • Включить мониторинг производительности только для сборок CI (я бы рекомендовал только для релизных сборок)

    gradlew сборкиRelease -PuseFirebasePerf = верно

Ответ 9

Для более новых версий плагина Firebase Perf (1.3.0 и выше) с Kotlin DSL вам необходимо добавить следующее:

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

}

Для версии Groovy вы можете ознакомиться с документацией Firebase.