如何在开发过程中禁用Crashlytics


245

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

我不想每次我做一些愚蠢的事情都会导致崩溃

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


您是否尝试过从清单中删除api密钥,但我不记得这是否崩溃。
2013年

@timmied它崩溃。同时在Manifest崩溃的应用中注释掉整行,因此这使问题更加合法。
迈克尔

Answers:


172

来自Crashlytics的Marc。在进行调试构建时,有两种禁用Crashlytics的方法!

  1. 使用其他android:versionString进行调试和发布,然后从Crashlytics Web仪表板禁用调试版本的崩溃报告。

  2. 将对Crashlytics.start()的调用包装在检查调试标志的if语句中。您可以使用自定义标志,也可以使用此处提出的方法:如何检查APK是否已签名或“调试”?


5
@marcr仅使用BuildConfig.DEBUG怎么样?
dannyroa 2013年

3
@dannyroa BuildConfig.DEBUG不是适用于所有构建环境的标准标志。我相信在使用Eclipse和ADT进行构建时会设置一致,但在其他地方则不会。
2014年

11
BuildConfig.DEBUG如果使用Gradle进行构建,则应使用。它将始终正确生成。
奥斯汀·马奥尼

3
@marcr在最新版本的crashlytics(似乎与Fabric合并)中如何处理,库是否对内部进行检查BuildConfig.DEBUG
akhy 2015年

2
@akhyar它不会自动检查,我使用:if(BuildConfig.DEBUG!){Fabric.with(这一点,新Crashlytics());}
比约恩Kechel

387

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

将以下代码放入Application类中 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());

要么

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

(从Crashlytics不推荐使用的方法disable()复制)


编辑2:

您也可以选择将此选项添加到buildTypegradle中。该命令禁用发送crashlytics映射文件并为每个构建生成ID,从而加快了这些风味的gradle构建。(它不会在运行时禁用Crashlytics。)请参阅此处的Mike B的答案。

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

2
如果您在Application类之外的代码中调用Crashlytics,则使用起来会更好,并且可以避免应用程序崩溃。
speedynomads 2015年

1
在Crashlytics 2.3.0中已弃用:(
达米安·

1
ext.enableCrashlytics = false 2.5也不适合我。实际上,它从未奏效。甚至在面料之前。
阮宝龙

2
我在这里有一个问题。这会启用Answer和Beta吗?看起来这应该更正确:CrashlyticsCore core = new CrashlyticsCore.Builder()。disabled(BuildConfig.DEBUG).build(); Fabric.with(this,new Answers(),new Beta(),new Crashlytics.Builder()。core(core).build());
gbero 2015年

1
如果正确使用ext.enableCrashlytics = false不会崩溃。如何解决崩溃问题在Fabrics文档中:docs.fabric.io/android/crashlytics/build-tools.html
弗兰克(Frank)

46

选择的答案不再正确。Google 更改了 Crashlytics 的集成。我当前的版本是2.9.1,唯一要做的就是添加implementation '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无法正常工作,因为在Debug Builds中找不到Crashlytics类。因此,将Gradle实现更改为:

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

然后转到清单,然后在meta-data标签内添加以下application标签:

<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。请注意,然后在配置Crashlytics时检查BuildConfig.DEBUG,例如:

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

2
这看起来很干净。当不在Application实例中时,而不是在主要活动中初始化?
jules

他们在网站上声明:Enable collection for selected users by initializing Crashlytics from one of your app's activities但是我猜如果您在应用程序中初始化Crashlytics不会有太大变化。你试过了吗?如果有效,则可以将其添加到我的答案中。 firebase.google.com/docs/crashlytics/customize-crash-reports
保罗Spiesberger

2
为了在运行时禁用crashlytics,我无法使用其他任何解决方案。解决方案1运作完美-为什么我没有想到这一点。

感谢您的解决方案。当我firebase_crashlytics_collection_enabled在清单中设置为false时,崩溃不会出现在控制台上(我使用v2.9.9)。因此,我通过添加单独的清单(用于调试构建firebase_crashlytics_collection_enabled=falsetrue发布)来解决此问题
Vasily Kabunov

30

如果您使用Gradle,只需将其添加到风味中:

ext.enableCrashlytics = false

1
那只是为了味道?调试与发布又如何呢?我试图禁用调试,但仍发送崩溃
夏琳

我认为它仅适用于口味。IMO使用Austyn和Marcc指出的标志是最简单的。
user1998494

我找到了解决方案。但不确定它是否兼容旧的Crashlytics。它用于Fabric SDK中的新Crashlytics。在下面检查我的答案
xialin

1
该命令禁用发送crashlytics映射文件并为每个构建生成ID,从而加快了这些风味的gradle构建。(它不会禁用Crashlytics在运行时。)见麦克B的答案在这里:stackoverflow.com/questions/28339323/...
的Aphex

18
这导致了车祸...“ This app relies on Crashlytics.
Sakiboy '16

27

查看最新文档。 https://docs.fabric.io/android/crashlytics/build-tools.html#gradle-advanced-setup

除了ext.enableCrashlytics = false需要添加build.grade 之外,

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);

我尝试过这种方式,但应用仍然崩溃This app relies on Crashlytics. Please sign up for access at
Balflear

我想您ext.enableCrashlytics = false在build.gradle 中丢失了。
Abhishek Patidar '18 -10-17

不,我已经在build.gradle文件的调试构建类型中添加了它,它在buildTypes -> debug, also i'm applying the plugin via apply插件中:'io.fabric'`
Balflear

我不确定为什么该解决方案甚至被否决了24次。发生This app relies on Crashlytics. Please sign up for access at https://fabric.io/sign_up
事故

24

我发现是最简单的解决方案:

    release {
        ...
        buildConfigField 'Boolean', 'enableCrashlytics', 'true'
    }
    debug {
        buildConfigField 'Boolean', 'enableCrashlytics', 'false'
    }

上面的几行将enableCrashlyticsBuildConfig文件中创建一个静态布尔字段,您可以使用该布尔字段来决定是否启动Fabric

    if (BuildConfig.enableCrashlytics)
        Fabric.with(this, new Crashlytics());

注意:使用此方法时,仅在发布版本中初始化Fabrics(如以上代码所示)。这意味着您需要将对Crashlytics类的statics方法的调用放在一个if块中,该块检查Fabrics是否已初始化,如下所示。

if (Fabric.isInitialized())
    Crashlytics.logException(e);

否则Must Initialize Fabric before using singleton(),在模拟器上进行测试时,应用程序将崩溃并显示错误。


17

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

如果允许您CrashlyticsBuildConfig.DEBUG先检查就调用方法的另一种选择。使用此设置,您可以安全地调用类似的方法Crashlytics.logException()-它们在调试版本中根本不执行任何操作。我看不到调试中上传的报告。

app / build.gradle

android {
    buildTypes {
        release {
            ext.enableCrashlytics = true
        }
        release {
            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)

我认为android:value="false"必须更改为android:value="${enableCrashlytics}"。是不是
JaydeepW

选项#2的另一个优点是,您可以从最初禁用分析收集开始,然后可以先询问用户可以跟踪其应用使用情况(请考虑GDPR)。然后,只有在用户同意跟踪时,您才进行Fabric.with调用。
Per Christian Henden

选项#2的唯一缺点是,即使在其中没有崩溃显示(因为已将其禁用),它仍会在Firebase仪表板中创建调试版本。这带来了两个问题-首先,这使得查找发行版本变得更加困难;第二-Firebase仪表板显示最近的100个版本 -这可能会阻止您在某些旧版本中看到崩溃。在Fabric仪表板中,您可以禁用特定版本,在Firebase的仪表板中是不可能的。
Alex Lipov

14

在此使用 MyApplication#onCreate()

if (!BuildConfig.DEBUG) Crashlytics.start(this);

编辑 如果您已升级到Fabric,请改用此答案


BuildConfig.DEBUG并非始终设置正确。在使用IntelliJ时,依靠它来启用/禁用Crashlytics对我造成了很多问题。
Zeb Barnett 2014年

5
您正在使用哪些构建工具?Gradle将始终设置该值。一年前是个问题,但是新的构建工具要好得多。
Austyn Mahoney 2014年

我正在使用IntelliJ的Gradle插件v0.9。+和Gradle本身的v1.11。
Zeb Barnett 2014年

我没有在任何应用程序中看到任何问题。BuildConfig是由Gradle任务生成的,可以保证运行。我还用于buildConfigField设置自定义字段,并且这些字段始终有效。tools.android.com/recent/androidstudio045released也建议您使用BuildConfig.DEBUG
Austyn Mahoney 2014年

作为理想主义者,我当然希望能够使用它,因为它可以简化我所服务的小型公司的非自动化构建过程。仅仅是我们将依赖于该标志的构建发布到了生产中,而Crashlytics从未看到过它的上线。回到手动切换之后,Crashlytics立即看到了它。
Zeb Barnett 2014年


9

我喜欢的另一个简单解决方案,因为它不需要其他清单文件:

第1步-在build.gradle中定义清单占位符

android {
    ...
    buildTypes {
        release {
            manifestPlaceholders = [crashlytics:"true"]
        }
        debug {
            manifestPlaceholders = [crashlytics:"false"]
        }
    }
    ...
}

第2步-在您的AndroidManifest.xml中使用它们

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

6

请注意,您还可以在调试版本中禁用讨厌的符号上传:

def crashlyticsUploadStoredDeobsDebug = "crashlyticsUploadStoredDeobsDebug"
def crashlyticsUploadDeobsDebug = "crashlyticsUploadDeobsDebug"
tasks.whenTaskAdded { task ->
    if (crashlyticsUploadStoredDeobsDebug.equals(task.name) ||
            crashlyticsUploadDeobsDebug.equals(task.name)) {

        println "Disabling $task.name."
        task.enabled = false
    }
}

只需将其放入build.gradle您的应用程序模块中即可。


6

如果要捕获所有崩溃(用于调试和发布版本),但想在“崩溃分析仪表板”中将它们分开,则可以将以下代码行添加到build.gradle中:

debug {
    versionNameSuffix "-DEBUG"
}

例如,如果您的应用的versionName为1.0.0,则您的发行版本将被标记为1.0.0,而调试版本将被标记为1.0.0-DEBUG


就是这个?不需要调味吗?
portfoliobuilder

6

这里有很多不错的答案,但是对于我的测试,我使用调试版本进行内部Beta和实验室之外的测试,在这些测试中,崩溃日志仍然非常有用,我仍然想报告它们。像OP一样,我想要做的就是在经常引起崩溃并迅速解决崩溃的主动开发过程中禁用它们。

除了删除所有调试崩溃外,您还可以选择仅在使用以下代码将设备连接到开发计算机时禁用报告。

if (!Debug.isDebuggerConnected()) {
    Fabric.with(this, new Crashlytics());
}

这是不对的。我使用记录代码中的非致命异常,Crashlytics.logException(e)并且此语句在调试版本中引发异常,因为未初始化Fabric单例。如果使用Crashlytics,则始终初始化Fabric单例。参见法米的答案
naXa

5

问题在于,所有解决方案都不能用于最新的crashlytics SDK。(我正在使用2.9.0)

您无法通过代码禁用它,因为它可以编译到您的项目中并在调用onCreate应用程序之前运行。因此,其他解决方案很简单-不需要时不要编译crashlytics。在build.gradle文件中,将“ compile”调用替换为“ releaseCompile”。

 releaseCompile('com.crashlytics.sdk.android:crashlytics:2.9.0@aar') {
        transitive = true
    }

3

使用Gradle构建时,最新最简单的版本:

if (!BuildConfig.DEBUG) {
    Fabric.with(this, new Crashlytics());
}

它使用来自Fabric的Crashlytics的新内置语法,并自动与Gradle构建一起使用。


3

我遇到了一个奇怪的问题:我遵循了xialin的回答(也出现在官方网站上),但没有用。原来,我是BuildConfig在Fabric的程序包中引用的,该程序包还包含一个静态DEBUG变量,即使在调试模式下,该变量也设置为false。

因此,如果您遵循上述解决方案,但仍然收到调试报告,请确保引用了以下内容:

import com.yourpackagename.BuildConfig;

而不是这样:

import io.fabric.sdk.android.BuildConfig;    

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

使用口味或构建配置。对开发人员构建使用单独的构建标识符,您的所有崩溃都会继续进入单独的应用程序。与同伴共享构建版本或在没有调试器的情况下使用构建版本时可以派上用场。像这样-

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

    production {
        applicationId "io.yourapp.app"
    }

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 trueBuildConfig.DEBUG时,它将初始化为true,这就是为什么我在BuildConfig类中添加了该变量的原因。

初始化面料:

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


BuildConfig.BUILD_TYPE_DEBUG是多余的,BuildConfig.DEBUG可用于获取相同的值
Antonis Radz

@AntonisRadz因为我需要一个可调试的发行版
M. Reza Nasirloo,

1

我们可以使用结构的isDebuggable()方法。

import static io.fabric.sdk.android.Fabric.isDebuggable;

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

快乐的编码:)


1

您可以将专用清单文件用于调试模式(适用于Crashlytics 2.9.7):

创建文件app/src/debug/AndroidManifest.xml并添加以下内容:

<application>

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

</application>

请注意,这个元数据元素必须投入调试/ AndroidManifest.xml中唯一的,并没有进入正规的AndroidManifest.xml

使用的解决方案CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()对我不起作用,我发现在调用Application.onCreate()或启动任何活动之前,由CrashlyticsInitProvider初始化了crashlytics,这意味着在应用程序或活动中手动初始化结构没有效果,因为结构已经初始化。


1

步骤1:在build.grade中

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}" />

第3步:在应用程序或第一个活动中

private void setupCrashReport() {
        if (BuildConfig.DEBUG) return;
        Fabric.with(this, new Crashlytics());
    }

我不确定是否需要执行步骤3,但是要确保发行版本可以正常运行。来源:https//firebase.google.com/docs/crashlytics/customize-crash-reports#enable_opt-in_reporting


1

这项工作对我来说:

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

并在buildTypes中:

debug {
ext.enableCrashlytics = false
}

如何在代码中使用Crashlytics?它会给您编译错误。
Micer

1

为了禁用以下版本com.google.firebase:firebase-crashlytics:17.0.0的Firebase Crashlytics,有两个选项:

  1. 将元标记添加到应用的清单

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

要么

  1. 直接在应用程序中进行配置(当设置为false时请记住,新值要在应用程序下次运行时才适用)

FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true)


0

如果您只想在IDE上执行此操作,则另一种方法是注销插件。显然,在您生成生成而无需再次登录时,它将停止发送报告。


0
  1. 将此添加到应用程序的build.gradle中:

    android {
        buildTypes {
            debug {
              // Disable fabric build ID generation for debug builds
              ext.enableCrashlytics = false
              ...
  2. 在运行时禁用Crashlytics工具包。否则,Crashlytics工具包将引发错误:

    // 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);
  3. 在AndroidManifest.xml中,添加

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

0

2020后织物答案

将以下代码粘贴到Application类中,然后setCrashlyticsState从应用程序onCreate 调用该方法。您可以选择将测试设备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。正在查看正确的Bui​​ldConfig类。通常有几种选择,而错误的选择可能会被拖入。


-8

这是一个愚蠢的答案,我知道
只需Fabric.with(this, new Crashlytics());将它注释掉,对其进行处理,然后在要发布它时取消注释即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.