CrashlyticsCore:缺少预期的方法:registerOnMeasurementEventListener

时间:2018-03-27 17:44:55

标签: android crashlytics crashlytics-android

我已经为Android设置了Crashlytics,在gradle文件中添加了依赖项。我使用Crashlytics.logException(exception);来记录异常。在应用程序抛出异常故障后,Crashlytics在Firebase控制台中被激活,但没有检测到任何事件且没有出现日志,因此控制台显示0崩溃。同时LogCat显示以下内容:

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

为什么缺少registerOnMeasurementEventListener方法;我只有一个默认的proguard-rules.pro文件,其中包含以下内容:

更新:

-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.**

5 个答案:

答案 0 :(得分:10)

扩展之前已经说过的内容,将它添加到proguard.cfg就足够了:

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

这是必要的唯一原因是Fabric通过反射引用这两个类,而proguard没有检测到它。

答案 1 :(得分:2)

添加到您的proguard-rules.pro

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

答案 2 :(得分:1)

我今天遇到了同样的问题。 我解决了它添加以下几行:

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

可能它可能与类DefaultAppMeasurementEventListenerRegistrar(方法寄存器(),第37行)有关。

答案 3 :(得分:1)

我遇到了同样的问题,我找到了解决方案...... 所以,看看堆栈跟踪,它说问题是找不到方法registerOnMeasurementEventListener,对吧?但它并没有说明在哪里。

查看该类DefaultAppMeasurementEventListenerRegistrar的反编译代码。它表明该方法是从类中调用的:

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

所以,我刚刚在proguard文件中添加了以下内容:

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

它起作用,警告消失了。我想我可以添加特定的类而不是com.google.android下的所有类,但我的思考过程是:我可能不想触及任何Android类,因为同样的问题可能会出现在其他库或其他代码中。

无论如何,我希望这可以帮助你或它可以帮助其他人遇到同样的问题。干杯!

答案 4 :(得分:0)

当我将Crashlytics集成到我正在使用firebase崩溃报告工具的项目时,我遇到了一个非常类似的问题。

我有这条线

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

当我用

替换它时
Crashlytics.log("NonFatal: Network Failure noticed ");

不再抛出此异常。 上面的日志与Timber日志记录集成在一起。

Timber.plant(...);