有没有什么简单的方法可以在开发过程中关闭Crashlytics Android SDK ?

我不希望每次我做一些愚蠢的事情时它都会崩溃

另一方面,我不想注释掉Crashlytics.start(),可能会忘记取消注释并提交


当前回答

我从Crashlytics找到了解决方案(与Fabric集成)

将以下代码放在应用程序类onCreate()中

Crashlytics crashlytics = new Crashlytics.Builder().disabled(BuildConfig.DEBUG).build();
Fabric.with(this, crashlytics);

编辑:

在Crashalitics 2.3及以上版本中,这是不推荐的。正确的代码是:

CrashlyticsCore core = new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build();
Fabric.with(this, new Crashlytics.Builder().core(core).build());

or

Fabric.with(this, new Crashlytics.Builder().core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()).build());

(复制自Crashlytics deprecated method disabled())


EDIT2:

你也可以选择将它添加到gradle中的buildType中。这个命令禁止发送crashlytics映射文件,并为每个构建生成一个ID,这可以加快那些风格的gradle构建。(它不会在运行时禁用Crashlytics。)请看迈克B的回答。

buildTypes {
    release {
           ....
    }
    debug {
        ext.enableCrashlytics = false
    }
}

其他回答

2020年后面料的答案

将下面的代码粘贴到您的Application类中,并从应用程序onCreate调用方法setCrashlyticsState。您也可以选择将您的测试设备id添加到debugDevices HashSet中,这样您的个人设备就可以被忽略,即使是在发布模式下构建。

请注意。由Settings.Secure.getString(getContext().getContentResolver(), Settings.Secure.ANDROID_ID)返回的设备id;不保证是唯一的或常量(它可以在出厂重置或在根设备上手动更改)。但它应该足够好了。

private final HashSet<String> debugDevices = new HashSet<String>(Arrays.asList("6a3d5c2bae3fd32c"));

private boolean isDebugDevice(String deviceId) {
    return debugDevices.contains(deviceId);
}

private void setCrashlyticsState() {
    @SuppressLint("HardwareIds")
    String deviceId = Settings.Secure.getString(getContext().getContentResolver(), Settings.Secure.ANDROID_ID);
    if (BuildConfig.DEBUG || isDebugDevice(deviceId)) {
        Log.v("DeviceId", deviceId);
        FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(false);
    }
}

检查BuildConfig。正在查看正确的BuildConfig类。通常会有几个选项,而错误的选项可能会被拖进去。

所选的答案不再正确。谷歌改变了Crashlytics的整合。我目前的版本是2.9.1,我唯一要做的是,添加实现'com.crashlytics.sdk.android:crashlytics:2.9.1'到我的Gradle文件。没有更多的事情需要,很好,但这意味着Crashlytics一直在运行。

解决方案1

只在发布版本编译Crashlytics:

dependencies {
   ...
   releaseImplementation 'com.crashlytics.sdk.android:crashlytics:2.9.1' // update version
}

解决方案2

如果你想额外配置Crashlytics,那么解决方案1是行不通的,因为在调试版本中找不到Crashlytics类。因此,将Gradle实现更改为:

implementation 'com.crashlytics.sdk.android:crashlytics:2.9.1' // update version

然后转到你的Manifest,在应用程序标签中添加以下元数据标签:

<application
        android:name="...>

        <meta-data
            android:name="firebase_crashlytics_collection_enabled"
            android:value="false" />

...

</application>

添加到您的启动活动(只需要一次,而不是每个活动)

if (!BuildConfig.DEBUG) { // only enable bug tracking in release version
   Fabric.with(this, new Crashlytics());
}

这只会在发布版本中启用Crashlytics。注意,还要检查BuildConfig。调试当你配置Crashlytics,例如:

if (!BuildConfig.DEBUG) {
   Crashlytics.setUserIdentifier("HASH_ID");
}

Add this to your app’s build.gradle: android { buildTypes { debug { // Disable fabric build ID generation for debug builds ext.enableCrashlytics = false ... Disable the Crashlytics kit at runtime. Otherwise, the Crashlytics kit will throw the error: // Set up Crashlytics, disabled for debug builds // Add These lines in your app Application class onCreate method Crashlytics crashlyticsKit = new Crashlytics.Builder() .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()) .build(); // Initialize Fabric with the debug-disabled crashlytics. Fabric.with(this, crashlyticsKit); In AndroidManifest.xml, add <meta-data android:name="firebase_crashlytics_collection_enabled" android:value="false" />

2019的答案

我一直在尝试只在发行版中启用Crashlytics,在调试中禁用2小时,检查Firebase控制台,看看异常是否上传。

有两种可能的方法。

选项1

它工作,但如果你在调试构建调用任何Crashlytics方法,应用程序将崩溃。

app / build.gradle

android {
    buildTypes {
        release {
            manifestPlaceholders = [crashlyticsEnabled: true]
        }
        debug {
            manifestPlaceholders = [crashlyticsEnabled: false]
        }

AndroidManifest.xml

<manifest
    <application
        <meta-data
            android:name="firebase_crashlytics_collection_enabled"
            android:value="${crashlyticsEnabled}" />

选项2

如果允许您调用Crashlytics方法而不检查BuildConfig,则可以选择此方法。调试。有了这个设置,你可以安全地调用Crashlytics.logException()这样的方法——它们在调试版本中什么都不做。我在调试中没有看到报告被上传。

app / build.gradle

android {
    buildTypes {
        release {
            ext.enableCrashlytics = true
        }
        debug {
            ext.enableCrashlytics = false
        }

AndroidManifest.xml

<manifest
    <application
        <meta-data
            android:name="firebase_crashlytics_collection_enabled"
            android:value="false" />

应用程序onCreate ()

val crashlytics = Crashlytics.Builder()
    .core(CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
    .build()
Fabric.with(this, crashlytics)

2022答案使用FirebaseCrashlytics。

有两种情况:

如果你想禁用Crashlytics数据收集的所有应用程序运行(如禁用Crashlytics在调试模式),那么你需要禁用它的清单文件通过设置标志firebase_crashlytics_collection_enabled为false

构建。gradle(应用):

// Next two flags to enable/disable Crashlytics
def enableCrashlyticsInDebugBuild = false
def enableCrashlyticsInReleaseBuild = true


android {
  buildTypes {

        release {
                manifestPlaceholders = [crashlyticsEnabled:"${enableCrashlyticsInReleaseBuild}"]
        }

        debug {
                manifestPlaceholders = [crashlyticsEnabled:"${enableCrashlyticsInDebugBuild}"]
        }
  }
}

然后在清单文件中将其添加到application标签下。

<meta-data
            android:name="firebase_crashlytics_collection_enabled"
            android:value="${crashlyticsEnabled}" />

如果你想禁用Crashlytics的一些用户,当他们选择退出数据收集。

要处理这个问题,您应该使用setCrashlyticsCollectionEnabled方法。

Kotlin API (Java API类似):

FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(false)

当设置为false时,新值直到下次运行应用程序才适用。

引用:

https://firebase.google.com/docs/crashlytics/customize-crash-reports?platform=android#enable-reporting https://firebase.google.com/docs/reference/kotlin/com/google/firebase/crashlytics/FirebaseCrashlytics#setcrashlyticscollectionenabled