如何在开发过程中禁用Crashlytics

270

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

我不想每次做傻事都发送一份崩溃报告。

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


你尝试过从清单中删除API密钥吗?我不记得那是否会导致崩溃。 - Timmetje
@timmied 它会崩溃。在“清单”中注释整行也会导致应用程序崩溃,因此这使问题更加合法。 - Michael
31个回答

3
您可以在调试模式下使用一个专用的清单文件(对于我来说,在Crashlytics 2.9.7中有效):
创建文件app/src/debug/AndroidManifest.xml,并添加以下内容:

<application>

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

</application>

请注意,这个元数据元素必须只放在debug/AndroidManifest.xml中,而不是常规的AndroidManifest.xml中。
使用CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()的解决方案对我无效。我发现,在调用Application.onCreate()或启动任何活动之前,CrashlyticsInitProvider已经初始化了crashlytics,这意味着在应用程序或活动中手动初始化fabric没有效果,因为fabric已经被初始化。

2
如果您担心BuildConfig.DEBUG未正确设置,请使用ApplicationInfo代替:
boolean isDebug = ( mAppContext.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) != 0;
Crashlytics crashlytics = new Crashlytics.Builder().disabled( isDebug ).build();
Fabric.with( uIContext, crashlytics );

2

如果您想要一个可调试的发布版本构建,这是方法:

buildTypes {
    release {
        signingConfig signingConfigs.config
        debuggable true //-> debuggable release build
        minifyEnabled true
        multiDexEnabled false
        ext.enableCrashlytics = true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        buildConfigField 'boolean', 'BUILD_TYPE_DEBUG', 'false'
    }
    debug {
        minifyEnabled false
        multiDexEnabled true
        ext.enableCrashlytics = false
        ext.alwaysUpdateBuildId = false
        // Disable fabric build ID generation for debug builds
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        buildConfigField 'boolean', 'BUILD_TYPE_DEBUG', 'true'
    }
}

当你设置 debuggable true 时,你的 BuildConfig.DEBUG 将被初始化为 true,这就是我在 BuildConfig 类中添加该变量的原因。

初始化 Fabric:

Crashlytics crashlytics = new Crashlytics.Builder()
            // disable crash reporting in debug build types with custom build type variable
            .core(new CrashlyticsCore.Builder().disabled(BuildConfig.BUILD_TYPE_DEBUG).build())
            .build();

    final Fabric fabric = new Fabric.Builder(this)
            .kits(crashlytics)
            //enable debugging with debuggable flag in build type 
            .debuggable(BuildConfig.DEBUG)
            .build();

    // Initialize Fabric with the debug-disabled crashlytics.
    Fabric.with(fabric);

ext.enableCrashlyticsext.alwaysUpdateBuildId的目的是什么,因为它们似乎没有被引用到任何地方。我有什么遗漏吗? - jules
@jules,文档里有详细说明 https://docs.fabric.io/android/crashlytics/build-tools.html - M. Reza Nasirloo
BuildConfig.BUILD_TYPE_DEBUG 是多余的,可以使用 BuildConfig.DEBUG 来获取相同的值。 - Antonis Radz
@AntonisRadz 因为我需要一个可调试的发布版本。 - M. Reza Nasirloo

2

使用“flavors”或“build configs”。为开发构建使用单独的构建标识符,这样所有崩溃都将继续发送到一个单独的应用程序中。在与同行共享构建或在没有调试器的情况下使用时非常方便。类似于以下内容 -

    productFlavors {
    dev {
        applicationId "io.yourapp.developement"
    }
    staging {
        applicationId "io.yourapp.staging"
    }

    production {
        applicationId "io.yourapp.app"
    }

2

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类。通常有几个选项,错误的选项可能会被引入。


2
补充一下,大多数开发者只会对以下代码感兴趣:if (BuildConfig.DEBUG) { FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(false); } - Soufiane Sakhi

1
我们可以使用fabric的isDebuggable()方法。
import static io.fabric.sdk.android.Fabric.isDebuggable;

if(! isDebuggable()){
    // set Crashlytics ... 
}

愉快的编码 :)


1
步骤1:在build.gradle中。
buildTypes {
        debug {
            debuggable true
            manifestPlaceholders = [enableCrashlytic:false]
        }
        release {
            debuggable false
            manifestPlaceholders = [enableCrashlytic:true]
        }
    }

步骤2:在清单文件中。
<meta-data
            android:name="firebase_crashlytics_collection_enabled"
            android:value="${enableCrashlytic}" />

第三步:在应用程序或第一个活动中。
private void setupCrashReport() {
        if (BuildConfig.DEBUG) return;
        Fabric.with(this, new Crashlytics());
    }

我不确定第三步是否必要,但为了确保发布版本不会崩溃,应该执行。来源:https://firebase.google.com/docs/crashlytics/customize-crash-reports#enable_opt-in_reporting

0

这对我有用:

    releaseCompile  'com.crashlytics.sdk.android:crashlytics:2.9.9'

并且在buildTypes中:

debug {
ext.enableCrashlytics = false
}

Crashlytics 在代码中的使用怎么样?它会给你编译错误。 - Micer
Crashlytics 发现一个无效的 API 密钥:null。 - CS QGB

0

如果您只想在IDE上执行此操作,另一种方法是注销插件。显然,在您生成构建时不再登录会停止发送报告。


-1
将以下内容添加到应用程序的build.gradle文件中: ``` android { buildTypes { debug { // Disable fabric build ID generation for debug builds ext.enableCrashlytics = false ... ```
在运行时禁用Crashlytics kit。否则,Crashlytics kit会抛出错误: ``` // 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); ```
在AndroidManifest.xml文件中添加: ``` ```

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接