如何在开发过程中禁用Crashlytics

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

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

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

102870 次浏览

这里是Crashlytics的Marc。这里有几个方法来禁用Crashlytics,而你正在做你的调试构建!

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

  2. 将对Crashlytics.start()的调用包装在检查调试标志的if语句中。您可以使用自定义标志或类似于这里提出的方法:如何检查APK是否有签名或“调试构建”?< / >

MyApplication#onCreate()中使用这个

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

<强>编辑 如果你升级到Fabric,使用回答代替

如果你只想在你的IDE上做这件事,另一种方法是注销插件。显然,它将停止发送报告,而您正在生成构建,无需再次登录。

如果你使用Gradle,只需添加这个到一个风味:

ext.enableCrashlytics = false

我从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());

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

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


EDIT2:

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

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

注意,你也可以在调试构建中禁用烦人的符号上传:

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中。

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

debug {
versionNameSuffix "-DEBUG"
}

例如,如果你的应用程序的versionName是1.0.0,你的发布版本将被标记为1.0.0,而调试版本将被标记为1.0.0- debug

如果你担心BuildConfig.DEBUG设置不正确,可以使用ApplicationInfo:

boolean isDebug = ( mAppContext.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) != 0;
Crashlytics crashlytics = new Crashlytics.Builder().disabled( isDebug ).build();
Fabric.with( uIContext, crashlytics );

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

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

上面的代码行将在BuildConfig文件中创建一个名为enableCrashlytics的静态布尔字段,你可以用它来决定是否初始化Fabric:

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

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

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

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

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

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

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

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

除了在build中添加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);
这是一个愚蠢的答案,我知道
只需注释掉Fabric.with(this, new Crashlytics());,处理它,当你想释放它时取消注释。< / p >

这里有很多好的答案,但对于我的测试,我使用内部测试和实验室外测试的调试版本,其中崩溃日志仍然非常有用,我仍然希望报告它们。就像OP一样,我所希望的是在活跃的开发过程中禁用它们,因为我经常导致和快速解决崩溃。

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

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

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

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


production {
applicationId "io.yourapp.app"
}

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

所以,如果你遵循前面提到的解决方案,你仍然得到调试报告,确保你引用了这个:

import com.yourpackagename.BuildConfig;

而不是这个:

import io.fabric.sdk.android.BuildConfig;

如果你想要一个可调试的版本,方法如下:

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织物:

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

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

你不能通过代码禁用它,因为它编译到你的项目中,甚至在调用你的应用程序的onCreate之前运行。所以其他的解决方案很简单——不要在不需要的时候编译崩溃分析。 在build中将'compile'调用替换为'releaseCompile'。gradle文件。< / p >
 releaseCompile('com.crashlytics.sdk.android:crashlytics:2.9.0@aar') {
transitive = true
}

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

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


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

快乐编码:)

所选的答案不再正确。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是无效的,因为在调试版本中找不到Crashlytics类。因此,将Gradle实现更改为:

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

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

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

根据谷歌使用此代码禁用Crashlytics,它也将改善构建过程。

enter image description here

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

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

    android {
    buildTypes {
    debug {
    // Disable fabric build ID generation for debug builds
    ext.enableCrashlytics = false
    ...
    
  2. 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);
    
  3. In AndroidManifest.xml, add

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

你可以使用专用清单文件调试模式(适用于我与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()的解决方案不适合我,我发现crashlytics在application . oncreate()被调用或任何活动启动之前由CrashlyticsInitProvider初始化,这意味着在应用程序或活动中手动初始化fabric没有效果,因为fabric已经初始化。

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

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

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.DEBUG,这是一个替代方法。有了这个设置,你可以安全地调用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)

步骤1:在build.grade中

buildTypes {
debug {
debuggable true
manifestPlaceholders = [enableCrashlytic:false]
}
release {
debuggable false
manifestPlaceholders = [enableCrashlytic:true]
}
}

步骤2:在manifest中

<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

这对我来说很有用:

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

和在buildTypes:

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

有两个选项可以禁用以下版本的Firebase Crashlytics:

  1. 添加元标签的应用程序的清单

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

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

FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true)

如果你的应用程序中还没有应用程序,那么创建一个扩展自应用程序的类。

然后执行以下步骤:

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"
........>
答:< p >更新 从gradle配置中禁用crlytics以提高构建速度
android {
...
buildTypes {
debug {
ext.enableCrashlytics = false
}
}
}

或者kotlin kts:

android {
...
buildTypes {
getByName("debug") {
extra["enableCrashlytics"] = false
}
}
}

然后编程地:

// Initializes Fabric for builds that don't use the debug build type.
Crashlytics.Builder()
.core(CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
.build()
.also { crashlyticsKit ->
Fabric.with(this, crashlyticsKit)
}

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

android {
...
buildTypes {
getByName("debug") {
extra["alwaysUpdateBuildId"] = false
}
}
}

或groovy:

android {
...
buildTypes {
debug {
ext.alwaysUpdateBuildId = false
}
}
}

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

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

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

<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="${crashlyticsEnabled}" />
  1. 如果你想禁用Crashlytics的一些用户,当他们选择退出数据收集。

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

Kotlin API (Java API类似):

FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(false)

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

引用:

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

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