web-dev-qa-db-fra.com

CrashlyticsCore: Méthode prévue manquante: registerOnMeasurementEventListener

J'ai configuré Crashlytics pour Android en ajoutant les dépendances dans les fichiers de classement. J'utilise Crashlytics.logException(exception); pour enregistrer les exceptions. Crashlytics a été activé dans la console Firebase après que l'application ait lancé une exception à dessein, mais aucun événement n'a été détecté et aucun journal n'est apparu. La console affiche donc 0 crash. Dans le même temps, le LogCat affiche les éléments suivants:

I/CrashlyticsCore: Initializing Crashlytics 2.6.1.23
I/CrashlyticsInitProvider: CrashlyticsInitProvider initialization successful
W/CrashlyticsCore: Expected method missing: registerOnMeasurementEventListener
    Java.lang.NoSuchMethodException: parameter type is null
        at Java.lang.Class.getMethod(Class.Java:656)
        at Java.lang.Class.getDeclaredMethod(Class.Java:626)
        at com.crashlytics.Android.core.DefaultAppMeasurementEventListenerRegistrar.invoke(DefaultAppMeasurementEventListenerRegistrar.Java:89)
        at com.crashlytics.Android.core.DefaultAppMeasurementEventListenerRegistrar.register(DefaultAppMeasurementEventListenerRegistrar.Java:54)
        at com.crashlytics.Android.core.CrashlyticsController.registerAnalyticsEventListener(CrashlyticsController.Java:1574)
        at com.crashlytics.Android.core.CrashlyticsCore.doInBackground(CrashlyticsCore.Java:320)
        at com.crashlytics.Android.core.CrashlyticsCore.doInBackground(CrashlyticsCore.Java:44)
        at io.fabric.sdk.Android.InitializationTask.doInBackground(InitializationTask.Java:63)
        at io.fabric.sdk.Android.InitializationTask.doInBackground(InitializationTask.Java:28)
        at io.fabric.sdk.Android.services.concurrency.AsyncTask$2.call(AsyncTask.Java:311)
        at Java.util.concurrent.FutureTask.run(FutureTask.Java:237)
        at Java.util.concurrent.Executors$RunnableAdapter.call(Executors.Java:422)
        at Java.util.concurrent.FutureTask.run(FutureTask.Java:237)
        at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1112)
        at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:587)
        at Java.lang.Thread.run(Thread.Java:818)
I/CrashlyticsCore: Crashlytics report upload complete: 5ABA789603A5-0001-7C52-7AF6D12C00C8

Pourquoi la méthode registerOnMeasurementEventListener est-elle manquante? Je n'ai qu'un fichier par défaut proguard-rules.pro avec les éléments suivants:

MIS À JOUR:

-assumenosideeffects class Android.util.Log {
    public static int d(...);
}

############ Crashlytics ################################
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
-keep public class * extends Java.lang.Exception
-keep class com.crashlytics.** { *; }
-dontwarn com.crashlytics.**
7
Galya

En développant ce que plusieurs ont déjà dit auparavant, il suffit de vous ajouter ceci proguard.cfg:

-keep class com.google.Android.gms.measurement.AppMeasurement { *; }
-keep class com.google.Android.gms.measurement.AppMeasurement$OnEventListener { *; }

La seule raison pour laquelle cela est nécessaire est que Fabric référence ces deux classes par réflexion et proguard ne le détecte pas.

9
Ben Sandee

Ajouter à votre proguard-rules.pro

 ############ Crashlytics ################################
-keepattributes *Annotation*
-keep class com.crashlytics.** { *; }
-dontwarn com.crashlytics.**
-keepattributes SourceFile,LineNumberTable 
1
webzooh

J'ai rencontré le même problème aujourd'hui… .. Je l'ai résolu en ajoutant les lignes ci-dessous:

-keep class com.google.Android.gms.measurement.** { *; }
-dontwarn com.google.Android.gms.measurement.**

Il pourrait probablement être lié à la classe DefaultAppMeasurementEventListenerRegistrar (méthode register (), ligne 37)

1
R. Suguro

J'avais le même problème et je viens de trouver la solution .... Donc, si on regarde le stacktrace, on voit que le problème est que la méthode registerOnMeasurementEventListener n'est pas trouvée, n'est-ce pas? Mais ça ne dit pas où.

En regardant le code décompilé pour cette classe DefaultAppMeasurementEventListenerRegistrar. Cela montre que la méthode est appelée depuis la classe:

Class onEventListenerClass = this.getClass("com.google.Android.gms.measurement.AppMeasurement$OnEventListener");

Donc, je viens d’ajouter l’extra suivante au fichier proguard:

-keep class com.google.Android.** { *; }

Et cela a fonctionné, l'avertissement est parti. J'imagine que j'aurais pu ajouter la classe spécifique au lieu de toutes les informations sous com.google.Android, mais mon processus de réflexion était le suivant: je ne souhaite peut-être pas toucher aux classes Android, car ce même problème pourrait se produire pour d'autres bibliothèques ou pour du code.

Quoi qu'il en soit, j'espère que cela vous aidera ou aidera peut-être d'autres personnes aux prises avec le même problème. À votre santé!

1

J'avais un problème très similaire lorsque j'intégrais Crashlytics dans un projet pour lequel j'utilisais l'outil de compte rendu des incidents de Firebase. 

J'ai eu cette ligne 

FirebaseCrash.report(new Exception("NonFatal: Network Failure");

Quand je l'ai remplacé par 

Crashlytics.log("NonFatal: Network Failure noticed ");

Cette exception n'a plus été levée. Le journal ci-dessus a été intégré à la journalisation du bois.

Timber.plant(...);
0
sat