Javascript 将Crashlytics集成到React Native-Android中

Javascript 将Crashlytics集成到React Native-Android中,javascript,java,android,facebook,react-native,Javascript,Java,Android,Facebook,React Native,我已经为我们的React原生项目成功地为iOS设置了Crashlytics集成,并成功地注册了android版本。唯一的问题是它只报告与Java/系统相关的崩溃-如果抛出javascript异常,它不会向报告注册。我想让它工作,因为iOS版本已经有了功能 我已经按照中的概述设置了报告-请参见下面的第二个答案,我已经在MainActivity中添加了onCreate 接下来,我尝试按照创建自己的NativeModuleCallExceptionHandler。代码如下: package com.m

我已经为我们的React原生项目成功地为iOS设置了Crashlytics集成,并成功地注册了android版本。唯一的问题是它只报告与Java/系统相关的崩溃-如果抛出javascript异常,它不会向报告注册。我想让它工作,因为iOS版本已经有了功能

我已经按照中的概述设置了报告-请参见下面的第二个答案,我已经在MainActivity中添加了
onCreate

接下来,我尝试按照创建自己的NativeModuleCallExceptionHandler。代码如下:

package com.mypackage;

import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.modules.core.JavascriptException;
import com.facebook.react.bridge.NativeModuleCallExceptionHandler;

import java.util.Map;

import com.crashlytics.android.Crashlytics;

class CrashlyticsErrorModule extends ReactContextBaseJavaModule {

  public CrashlyticsErrorModule (ReactApplicationContext reactContext) {
    super(reactContext);
    addExceptionHandler(reactContext);
  }

  @Override
  public String getName() {
    return "CrashlyticsErrorModule";
  }

  private void addExceptionHandler(ReactApplicationContext reactContext) {
    reactContext.setNativeModuleCallExceptionHandler(new NativeModuleCallExceptionHandler() {
      @Override
      public void handleException(Exception e) {
        if (e instanceof JavascriptException) {
          Crashlytics.log(e.getMessage());
        } else {
          Crashlytics.logException(e);
        }
      }
    });
  }
代码编译时没有错误,但是仍然没有报告Javascript异常

即使在
onCreate()
中或在
addExceptionHandler()
方法末尾故意抛出运行时异常,也不会调用
handleException()
。但是Crashlytics确实会收到通知,因此异常会在某个地方被捕获

源代码的链接在上面的问题评论中。

简而言之:您可以使用
ErrorUtils.setGlobalHandler((err,isFatal)=>{…})
捕获js异常并使用
Crashlytics.recordCustomExceptionName(…)
将其抛出到Crashlytics
react native fabric crashlytics
npm模块可以自动为您执行此操作


不要忘记添加
Fabric.with(这是一个新的Crashlytics())
onCreate()
方法
main应用程序
(或者
MainActivity
,如果您使用的RN低于0.29)。

小注释:捕获只在发布版本中有效(
react native Fabric Crashlytics
跳过在开发环境中抛出)。