web-dev-qa-db-fra.com

Firebase Performance Plugin ralentissant le temps de construction

Lorsque vous utilisez Firebase Performance dans Android Studio, la tâche de gradation app:transformClassesWithFirebasePerformancePluginForDebug prend beaucoup plus de temps que toute autre tâche et ralentit donc considérablement le temps de création de mon dégradé.

Construction lente montrée dans Profiler

16
Ian White

Dans notre projet, Firebase a entraîné une augmentation de 40% du temps de construction. Pour accélérer les générations de débogage, nous avons ajouté la possibilité de l'activer/désactiver à l'aide de paramètres de construction dans les fichiers app/build.gradle et root build.gradle:

app:

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

root/buildscript/dependencies:

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

lors de l'exécution à partir de la ligne de commande, utilisez

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

lorsque vous travaillez à partir d'Android Studio, ajoutez l'indicateur aux options du compilateur:

 Android Studio compiler options

30
Ivan Kravchenko

Toutes les réponses existantes sont valables, mais elles manquent toutes quelque chose.

Pour résoudre ce problème, vous avez le choix entre 2 options principales.

1. Utilisez la propriété firebasePerformanceInstrumentationEnabled

Ceci est le moyen officiel fourni par le SDK lui-même pour le désactiver pendant le processus de construction.

Qu'est-ce que ça fait:

  • Réduit le temps d'exécution de la tâche transformClassesWithFirebasePerformancePluginFor* à ~ 5-10s.
  • Désactive automatique traces et demande de surveillance, mais laisse personnalisé traces activé. Vous pouvez contrôler ce dernier avec les balises AndroidManifest <meta-data> et les appels à FirebasePerformance.getInstance().setPerformanceCollectionEnabled(). Plus d'infos dans les docs .

Avantages:

  • Une seule propriété à configurer.

Les ​​inconvénients:

  • Ne désactive pas complètement la surveillance des performances (si c'est ce que vous voulez).
  • Le plugin ajoute encore environ 5-15 secondes à la compilation.

Comment faire ceci: _

Je pense que c'est beaucoup plus facile de seulement activer plugin dans ces rares cas quand nous en avons besoin (habituellement ce sera seulement lorsque nous publierons l'application), plutôt que de la désactiver dans tous les autres cas .
Remarque: Bien entendu, avec les versions manuelles, vous pourriez oublier pour l'activer. Donc, si vous n'avez pas de CI, cela vaut peut-être la peine d'ajouter d'autres scripts automatiques dans Gradle ou de vous en tenir à l'approche inverse utilisée dans d'autres réponses.

En général cependant, nous n’avons besoin que de deux étapes:

  1. Ajoutez la ligne suivante au fichier gradle.properties

    firebasePerformanceInstrumentationEnabled=false
    
  2. Utilisez la commande suivante dans votre construction de configuration ou de configuration manuelle:

    ./gradlew assembleRelease -PfirebasePerformanceInstrumentationEnabled = true

2. Utilisez la propriété de projet Gradle personnalisée pour éviter d’appliquer le plugin firebase-perf Gradle

Qu'est-ce que ça fait:

  • Supprime complètement la tâche transformClassesWithFirebasePerformancePluginFor* ainsi que les frais généraux supplémentaires de ~ 5 à 10s présents lors de l'utilisation de la première solution.
  • Identique à la première méthode - désactive automatique traces et demande de surveillance, mais laisse les traces personnalisées. Vous pouvez contrôler ce dernier avec les balises AndroidManifest <meta-data> et les appels à FirebasePerformance.getInstance().setPerformanceCollectionEnabled(). Plus d'infos dans les docs .

Avantages:

  • Complètement élimine les dépenses de temps associées au plugin Firebase Performance Gradle.

Les ​​inconvénients:

  • Introduit la vérification conditionnelle pour l’application du plugin dans votre script Gradle, certains diront peut-être que ce n’est pas une approche idiomatique.
  • Encore une fois, ne désactivez pas complètement le contrôle des performances (si c'est ce que vous voulez).

Comment faire ceci: _

Cette approche comporte des points et des avertissements similaires et comprend également deux étapes:

  1. Modifiez le fichier build.gradle de votre module d'application:

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

    Remarque: vous inutile d'appliquer le même contrôle à votre build.gradle au niveau du projet:

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

    Gradle n'utilisera en aucune manière cette déclaration lorsque le plugin lui-même n'est pas activé.

    Et vous n'avez pas besoin pour exclure la dépendance guava-jdk5, si vous utilisez firebase-plugins v1.1.1 ou une version ultérieure comme comme indiqué dans la documentation .

  2. Utilisez la commande suivante dans votre construction de configuration ou de configuration manuelle:

    ./gradlew assembleRelease -PuseFirebasePerf

3. (Supplémentaire) Utilisez la propriété de projet Gradle personnalisée pour exclure firebase-perf SDK.

Si vous n'utilisez pas de traces personnalisées ni d'autres fonctionnalités du SDK Firebase Performance et ne vous fiez qu'à la surveillance automatique (en d'autres termes, vous ne dépendez pas du SDK dans votre code), vous pouvez alors exclure cette dépendance pour des tâches autres que de production. construit.

Avantage:

  • Cela pourrait vous épargner quelques ~ 5-10s supplémentaires, consacrés à la configuration de la dépendance et à "ProGuarding".

Désavantages:

  • Si vous mesuriez soigneusement votre taille APK, vous verrez soudainement une augmentation d'environ 0,4 Mb. Cela pourrait perturber vos rapports ou vos prévisions, vous devez donc en être conscient.
  • De même, si vous êtes sur le point de dépasser le nombre maximal de méthodes de 64 Ko, vous pouvez soudainement la franchir, voir que votre construction échoue et vous retrouver dans la zone MultiDex avec la nécessité de la mettre en œuvre et de tester votre application. Tout cela parce que Firebase Performance apporte un nombre impressionnant de références de méthodes de presque 5K (après l’application de ProGuard avec optimisations). 

Comment faire ceci: _

Il vous suffit de mettre à jour le fichier build.gradle de votre module d'application:

  • Si vous avez choisi d'utiliser la première option, changez votre dépendance de la manière suivante:

    if (project.property('firebasePerformanceInstrumentationEnabled') == 'true') {
      implementation "com.google.firebase:firebase-perf:${firebase_perf_version}"
    }
    
  • Si vous avez choisi le second:

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

Juste pour donner une autre option pour désactiver transformClassesWithFirebasePerformancePluginForDebug, voici ma recette:

Dans le dossier principal 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'
     }
}

Dans le fichier d'application 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
R. Zagórski

Tous les commentaires dans ce fil sont valides. Je veux suggérer un moyen très simple de désactiver cela pour les versions de débogage:

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

J'ai rencontré ce problème aussi. À l'origine, nous utilisions une variante de la réponse fournie par R. Zagórski, mais si l'on se base sur un fil similaire des forums Gradle, il semble que l'application conditionnelle d'un plugin à un projet n'est pas la bonne solution:

Les plugins ne peuvent pas être appliqués à seulement "une partie de votre projet". Ils sont appliqués ou non.

L'application conditionnelle de plugins semble fonctionner si vous pouvez le faire correctement, mais ce n'est pas une fonctionnalité officiellement prise en charge. Plus loin dans le même fil, un autre point est fait:

Mais le plugin devrait vous permettre de le configurer à un niveau de grain plus fin.

Effectivement, il existe une propriété exposée par le plug-in Firebase qui vous permet d'activer ou de désactiver l'instrumentation (par conséquent, de basculer le temps de construction accru). L'utilisation de cette propriété est toutefois délicate, car vous devez l'appliquer exactement au bon moment pendant le processus de construction, mais une fois que vous l'avez obtenue, vous pouvez essentiellement la faire pivoter sur ce que vous voulez.

L'extrait de code suivant montre comment nous faisons pivoter l'instrumentation en fonction des variantes de construction Debug et non-Debug. C'est écrit en Kotlin, mais j'imagine que cela se traduirait aussi bien en 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
            }
        }
    }

    ...
}

Notez que si cette tâche est en place, la tâche transformClassesWithFirebasePerformancePluginFor* sera toujours exécutée pour chaque variante de construction, mais elle s’achèvera presque immédiatement pour une variante pour laquelle l’instrumentation n’est pas activée.

3
Inirit

Je trouve qu'Android Studio commence à mettre beaucoup de temps à gagner du temps pour fermer Android Studio et organiser certains événements sur mon ordinateur, puis redémarrer. C'est mieux alors - avez-vous essayé de redémarrer?

0
Samantha Eastwood