如何在开发过程中禁用Crashlytics

时间:2013-06-07 14:38:06

标签: android crashlytics twitter-fabric

开发时是否有任何简单的方法可以关闭Crashlytics Android SDK?

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

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

29 个答案:

答案 0 :(得分:365)

我找到了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 deprecated method disabled()复制)


EDIT2:

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

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

答案 1 :(得分:160)

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

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

  2. 在检查调试标志的if语句中包含对Crashlytics.start()的调用。您可以使用自定义标记或类似于此处提议的方法:How to check if APK is signed or "debug build"?

答案 2 :(得分:34)

选择的答案不再正确。谷歌changed the integration的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

如果您想要additionally configure Crashlytics,那么解决方案1无效,因为在Debug Builds中找不到Crashlytics类。因此,将Gradle实现更改回:

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

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

<application
        android:name="...>

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

...

</application>

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

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

答案 3 :(得分:27)

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

ext.enableCrashlytics = false

答案 4 :(得分:26)

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

除了在build.grade中添加ext.enableCrashlytics = false,您需要这样做,

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

答案 5 :(得分:23)

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

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

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

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

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

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

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

答案 6 :(得分:14)

MyApplication#onCreate()

中使用此功能
if (!BuildConfig.DEBUG) Crashlytics.start(this);

修改 如果您已升级到Fabric,请改用此answer

答案 7 :(得分:7)

每个google都使用此代码禁用Crashlytics,这也将改善构建过程。

Fenwick Tree data-structure

引用-enter image description here

答案 8 :(得分:6)

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

debug {
    versionNameSuffix "-DEBUG"
}

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

答案 9 :(得分:6)

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

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

答案 10 :(得分:6)

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

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

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

答案 11 :(得分: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
    }
}

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

答案 12 :(得分:5)

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

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

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

答案 13 :(得分:3)

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

因此,如果您按照上述解决方案并仍然获得调试报告,请确保您参考此内容:

import com.yourpackagename.BuildConfig;

而不是这个:

import io.fabric.sdk.android.BuildConfig;    

答案 14 :(得分:3)

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

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

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

OR

  1. 直接在应用程序中进行配置(请牢记,将其设置为false时,新值将在下一次运行应用程序时应用)

FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true)

答案 15 :(得分:3)

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

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

它使用Fabric for Crashlytics的新内置语法,并自动使用Gradle构建。

答案 16 :(得分: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类中添加该变量的原因。

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

答案 17 :(得分:2)

使用口味或构建配置。为开发构建使用单独的构建标识符,所有崩溃将继续使用单独的应用程序。在与同行共享构建或在没有调试器的情况下使用它时,可以派上用场。像这样的东西 -

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

    production {
        applicationId "io.yourapp.app"
    }

答案 18 :(得分: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 );

答案 19 :(得分:2)

2019年答案

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

有两种可能的方法。

选项1

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

app / build.gradle

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

AndroidManifest.xml

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

选项2

一种替代方法,它允许您调用Crashlytics方法而无需先检查BuildConfig.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)

答案 20 :(得分:2)

2020 Post Fabric答案

将下面的代码粘贴到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。正在查看正确的Bui​​ldConfig类。通常有几种选择,而错误的选择可能会拖入其中。

答案 21 :(得分:1)

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

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

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

快乐编码:)

答案 22 :(得分:1)

您可以将专用清单文件用于调试模式(适用于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,这意味着手动初始化结构在应用程序中或活动中无效,因为结构已经初始化。

答案 23 :(得分:1)

如果您的应用程序中还没有一个从 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);
        }
  }
}

并且不要忘记在您的 AndroidManifest.xml

中添加该类
 <application
        android:name=".BaseApplication"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        ........>

答案 24 :(得分: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" />
    

答案 25 :(得分:0)

第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

答案 26 :(得分:0)

为我工作:

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

以及在buildTypes中:

debug {
ext.enableCrashlytics = false
}

答案 27 :(得分:0)

如果您只想在IDE上执行此操作,另一种方法是注销插件。显然,如果您在没有再次登录的情况下生成构建,它将停止发送报告。

答案 28 :(得分:-8)

这是愚蠢的答案,我知道 只需注释掉Fabric.with(this, new Crashlytics());,就可以解决这个问题,并在想要发布它时取消注释。