如何在开发过程中禁用Crashlytics

Mic*_*ael 232 android crashlytics twitter-fabric

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

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

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

xia*_*lin 378

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

将以下代码放在Application类中 onCreate()

Crashlytics crashlytics = new Crashlytics.Builder().disabled(BuildConfig.DEBUG).build();
Fabric.with(this, crashlytics);
Run Code Online (Sandbox Code Playgroud)

编辑:

在Crashalitics 2.3及以上版本中,这已被弃用.正确的代码是:

CrashlyticsCore core = new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build();
Fabric.with(this, new Crashlytics.Builder().core(core).build());
Run Code Online (Sandbox Code Playgroud)

要么

Fabric.with(this, new Crashlytics.Builder().core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()).build());
Run Code Online (Sandbox Code Playgroud)

(从Crashlytics已弃用的方法复制已禁用())


EDIT2:

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

buildTypes {
    release {
           ....
    }
    debug {
        ext.enableCrashlytics = false
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您在Application类之外的代码中调用Crashlytics,这将更好用,并会停止您的应用程序崩溃. (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()); (2认同)

mar*_*rcr 165

来自Crashlytics的Marc来自这里.在进行调试构建时,有几种方法可以禁用Crashlytics!

  1. 使用不同的android:versionString进行调试和发布构建,然后从Crashlytics Web仪表板中为调试版本禁用崩溃报告.

  2. 在检查调试标志的if语句中包含对Crashlytics.start()的调用.您可以使用自定义标志或类似于此处提议的方法:如何检查APK是否已签名或"调试构建"?

  • 如果使用Gradle构建,则应使用`BuildConfig.DEBUG`.它将始终正确生成. (11认同)
  • @marcr如何使用BuildConfig.DEBUG? (5认同)
  • @dannyroa BuildConfig.DEBUG不是适用于所有构建环境的标准标志.我相信它在使用Eclipse和ADT构建时是一致的,但在其他地方则不然. (3认同)
  • @marcr在最新版本的crashlytics中如何(因为它似乎与Fabric合并),库是否对内部检查`BuildConfig.DEBUG`? (3认同)
  • @akhyar没有自动检查,我使用:if(!BuildConfig.DEBUG){Fabric.with(this,new Crashlytics());} (2认同)
  • @marcr你不认为Crashlytics应该提供在朗姆酒时启用/禁用Crashlytics的方法.例如,请参阅此问题http://stackoverflow.com/questions/32168754 (2认同)
  • 第二种方法是错误的,因为`Crashlytics.logException(e);`会在调试版本中引发异常,因为未初始化Fabric单例。 (2认同)

Spi*_*pau 41

选择的答案不再正确.谷歌改变了 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
}
Run Code Online (Sandbox Code Playgroud)

解决方案2

如果您想要另外配置Crashlytics,那么解决方案1无法正常工作,因为在Debug Builds中找不到Crashlytics类.因此,将Gradle实现更改回:

implementation 'com.crashlytics.sdk.android:crashlytics:2.9.1' // update version
Run Code Online (Sandbox Code Playgroud)

然后转到您的Manifest并在meta-data标记内添加以下application标记:

<application
        android:name="...>

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

...

</application>
Run Code Online (Sandbox Code Playgroud)

添加到您的Launch-Activity(只需要一次性,而不是每个Activity)

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

这只会在发布版本中启用Crashlytics.注意,当你配置Crashlytics时,请检查BuildConfig.DEBUG,例如:

if (!BuildConfig.DEBUG) {
   Crashlytics.setUserIdentifier("HASH_ID");
}
Run Code Online (Sandbox Code Playgroud)

  • 这看起来很干净。而不是在主要活动中初始化,而不是在应用程序实例中? (2认同)
  • 为了在运行时禁用crashlytics,我无法使用其他任何解决方案。解决方案1运作良好-为什么我没有想到这一点。 (2认同)
  • 这应该是@Michael接受的答案 (2认同)

use*_*494 30

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

ext.enableCrashlytics = false
Run Code Online (Sandbox Code Playgroud)

  • 这导致了崩溃......"这个应用程序依赖于Crashlytics." (17认同)
  • 此命令禁止发送 crashlytics 映射文件并为每个构建生成 ID,从而加快这些风格的 gradle 构建速度。(它不会在运行时禁用 Crashlytics。)请参阅 Mike B 的答案:http://stackoverflow.com/questions/28339323/disable-importing-of-crashlytics/28357998#28357998 (2认同)

Abh*_*dar 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);
Run Code Online (Sandbox Code Playgroud)


fah*_*hmy 24

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

    release {
        ...
        buildConfigField 'Boolean', 'enableCrashlytics', 'true'
    }
    debug {
        buildConfigField 'Boolean', 'enableCrashlytics', 'false'
    }
Run Code Online (Sandbox Code Playgroud)

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

    if (BuildConfig.enableCrashlytics)
        Fabric.with(this, new Crashlytics());
Run Code Online (Sandbox Code Playgroud)

注意:使用此方法,仅在发布版本中初始化Fabrics(如上面代码中所示).这意味着你需要Crashlytics在一个if块中调用类中的静态方法,该块检查Fabrics是否已经初始化,如下所示.

if (Fabric.isInitialized())
    Crashlytics.logException(e);
Run Code Online (Sandbox Code Playgroud)

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


Aus*_*ney 14

使用它 MyApplication#onCreate()

if (!BuildConfig.DEBUG) Crashlytics.start(this);
Run Code Online (Sandbox Code Playgroud)

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

  • 你使用什么构建工具?Gradle将始终设置该值.这是一年前的问题,但新的构建工具要好得多. (5认同)

Mah*_*oud 10

2022 年答案使用 FirebaseCrashlytics。

有两种情况:

  1. 如果要禁用所有应用程序运行的 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}"]
        }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

<meta-data
            android:name="firebase_crashlytics_collection_enabled"
            android:value="${crashlyticsEnabled}" />
Run Code Online (Sandbox Code Playgroud)
  1. 如果您想在某些用户选择退出数据收集时禁用 Crashlytics。

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

Kotlin API(Java API 类似):

FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(false)
Run Code Online (Sandbox Code Playgroud)

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

参考:

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

  2. https://firebase.google.com/docs/reference/kotlin/com/google/firebase/crashlytics/FirebaseCrashlytics#setcrashlyticscollectionenabled


Lov*_*rma 8

按照谷歌使用此代码禁用Crashlytics,它也会改善构建过程。

在此处输入图片说明

参考-https://developer.android.com/studio/build/optimize-your-build

  • 不幸的是,该文档已被弃用,并且不再支持您引用的标志,请在此处检查:https://firebase.google.com/docs/crashlytics/upgrade-sdk?hl=da&amp;platform=android (2认同)

Alb*_*lvo 7

2019年答案

我一直在尝试仅在发布中启用Crashlytics并在调试中禁用2小时,检查Firebase控制台以查看是否上传了异常。

有两种可能的方法可以做到这一点。

选项1

它可以工作,但是如果您Crashlytics在调试版本中调用任何方法,则应用程序将崩溃

app / build.gradle

android {
    buildTypes {
        release {
            manifestPlaceholders = [crashlyticsEnabled: true]
        }
        debug {
            manifestPlaceholders = [crashlyticsEnabled: false]
        }
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml

<manifest
    <application
        <meta-data
            android:name="firebase_crashlytics_collection_enabled"
            android:value="${crashlyticsEnabled}" />
Run Code Online (Sandbox Code Playgroud)

选项2

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

app / build.gradle

android {
    buildTypes {
        release {
            ext.enableCrashlytics = true
        }
        release {
            ext.enableCrashlytics = false
        }
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml

<manifest
    <application
        <meta-data
            android:name="firebase_crashlytics_collection_enabled"
            android:value="false" />
Run Code Online (Sandbox Code Playgroud)

应用程序onCreate()

val crashlytics = Crashlytics.Builder()
    .core(CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
    .build()
Fabric.with(this, crashlytics)
Run Code Online (Sandbox Code Playgroud)

  • 我认为 `android:value="false"` 必须更改为 `android:value="${enableCrashlytics}"`。不是吗? (2认同)

Khr*_*nos 6

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

debug {
    versionNameSuffix "-DEBUG"
}
Run Code Online (Sandbox Code Playgroud)

例如,如果您的应用程序的versionName是1.0.0,那么您的发布版本将标记为1.0.0,而调试版本将为1.0.0-DEBUG


Wil*_*son 6

这里有很多好的答案,但对于我的测试,我使用调试版本进行内部测试和实验室外测试,其中崩溃日志仍然非常有用,我仍然想报告它们.和OP一样,我想要的只是在我经常引起并快速解决崩溃的活动开发期间禁用它们.

您可以选择仅在使用以下代码将设备连接到开发计算机时禁用所有调试崩溃,而不是删除所有调试崩溃.

if (!Debug.isDebuggerConnected()) {
    Fabric.with(this, new Crashlytics());
}
Run Code Online (Sandbox Code Playgroud)


arb*_*buz 6

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

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

android {
    ...
    buildTypes {
        release {
            manifestPlaceholders = [crashlytics:"true"]
        }
        debug {
            manifestPlaceholders = [crashlytics:"false"]
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

<meta-data
        android:name="firebase_crashlytics_collection_enabled"
        android:value="${crashlytics}" />
Run Code Online (Sandbox Code Playgroud)


Nia*_*med 6

如果您的应用程序中还没有一个从Application扩展的类,请创建一个扩展类。

然后执行以下操作:

public class BaseApplication extends Application { // extend from MultidexApplication if multidex is required by your application 

    @Override
    public void onCreate() {
        super.onCreate();

        /*
         *  Crashlytics is enabled by default,
         *  Disable it for debug builds & USB Debugging
         * */

        if(BuildConfig.DEBUG){ 
            FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(false);
        }
  }
}
Run Code Online (Sandbox Code Playgroud)

并且不要忘记在AndroidManifest.xml中添加该类

 <application
        android:name=".BaseApplication"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        ........>
Run Code Online (Sandbox Code Playgroud)


Ari*_*bib 5

请注意,您还可以在调试版本中禁用恼人的符号上载:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Kva*_*ant 5

问题是没有一个解决方案适用于最新的crashlytics sdk.(我使用的是2.9.0)

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

 releaseCompile('com.crashlytics.sdk.android:crashlytics:2.9.0@aar') {
        transitive = true
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

有两个选项可以为以下版本 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)


Ahm*_*uar 5

更新的答案:从 gradle 配置中禁用 crashlytics,以受益于提高的构建速度。

android {
    ...
    buildTypes {
        debug {
            ext.enableCrashlytics = false
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或科特林 kts:

android {
    ...
    buildTypes {
        getByName("debug") {
            extra["enableCrashlytics"] = false
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后以编程方式:

android {
    ...
    buildTypes {
        debug {
            ext.enableCrashlytics = false
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以继续在调试构建上使用 crashlytics,但仍然可以通过防止 crashlytics 为每个构建生成新 ID 来提高构建速度:

android {
    ...
    buildTypes {
        getByName("debug") {
            extra["alwaysUpdateBuildId"] = false
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或时髦的:

android {
    ...
    buildTypes {
        debug {
            ext.alwaysUpdateBuildId = false
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

检查下面的文档链接: https ://developer.android.com/studio/build/optimize-your-build#disable_crashlytics


归档时间:

查看次数:

78376 次

最近记录:

6 年,2 月 前