Android 织物&x27;带Firebase can的Crashlytics';不能为调试版本禁用

Android 织物&x27;带Firebase can的Crashlytics';不能为调试版本禁用,android,firebase,crashlytics,google-fabric,crashlytics-android,Android,Firebase,Crashlytics,Google Fabric,Crashlytics Android,我有一个应用程序,通过Firebase利用Fabric的Crashlytics。 下面是在我的应用程序onCreate中执行的第一件事 CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder() .disabled(BuildConfig.DEBUG) .build(); Fabric.with(this, new Crashlytics.Builder().core(crashlyticsCore).build

我有一个应用程序,通过Firebase利用Fabric的Crashlytics。 下面是在我的应用程序onCreate中执行的第一件事

CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder()
    .disabled(BuildConfig.DEBUG)
    .build();
Fabric.with(this, new Crashlytics.Builder().core(crashlyticsCore).build());
尽管如此,崩溃是在
DEBUG==true
模式下提交的

我使用以下版本

以我的身材,格雷德尔
classpath“io.fabric.tools:gradle:1.25.1”

在我的应用程序/build.gradle中
implementation“com.crashlytics.sdk.android:crashlytics:2.9.1”


不幸的是,撞车事件仍有报道。任何想法,我做错了什么?

你需要禁用应用程序build.gradle的
Crashlytics

说明了一旦在应用程序会话中启用了报告,就不能将其禁用

默认情况下,在创建
应用程序
实例之前执行的名为CrashlyticsInitProvider的
ContentProvider
中启用Crashlytics报告。CrashlyticsInitProvider根据元数据值启用或禁用报告
firebase\u crashlytics\u collection\u enabled
,默认情况下为true

如果要禁用报告,则必须显示清单元数据并将其设置为false:

<meta-data
    android:name="firebase_crashlytics_collection_enabled"
    android:value="false" />
如果消息存在,
firebase\u crashlytics\u collection\u enabled
为真。如果消息不存在,则表示您已成功将元数据设置为禁用崩溃报告

如果元数据丢失或设置为true,则无法使用调用
Fabric.with(…)
禁用代码中的报告


在对另一个答案的评论中,您指出您尝试使用元数据禁用报告,但未成功。检查拼写错误并确保声明正确放置在
元素中。在我的测试中,我能够使用元数据禁用报告,然后在运行时启用

我终于找到了问题所在。Crashlytics是从内容提供程序初始化的,所以当您尝试从应用程序的
onCreate()
禁用时,为时已晚。通过查看反编译代码,我发现可以通过向清单中的元素添加元数据来禁用该初始化

所以,我要做的是。。。我已将其添加到app/src/debug/AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?><!--suppress ALL -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="<your app package>">

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

</manifest>
令我惊讶的是,我不需要用(…)做
结构。以上就够了


它工作正常:没有报告。

正确的答案已经发布,但是每次构建实际的发布APK时更改元数据值似乎有点乏味,因此这里有一个解决方案,它使用所谓的,并根据不同的属性自动将值更改为
buildType

将以下内容添加到您的应用程序
build.gradle

android {

    // ...

    buildTypes {
        debug {
            manifestPlaceholders = [enableCrashReporting:"false"]
        }
        release {
            manifestPlaceholders = [enableCrashReporting:"true"]
        }
    }

}
<manifest ... >

    <application ...>

        // ...

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

    </application>

</manifest>
并将其添加到您的
AndroidManifest.xml

android {

    // ...

    buildTypes {
        debug {
            manifestPlaceholders = [enableCrashReporting:"false"]
        }
        release {
            manifestPlaceholders = [enableCrashReporting:"true"]
        }
    }

}
<manifest ... >

    <application ...>

        // ...

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

    </application>

</manifest>


从android文档中获取此信息

启用选择性加入报告: 默认情况下,Firebase Crashlytics会自动收集所有应用程序用户的崩溃报告。为了让用户更好地控制他们发送的数据,您可以启用选择性加入报告

要做到这一点,您必须禁用自动收集,并仅为opt-in用户初始化Crashlytics

使用AndroidManifest.xml文件中的元数据标记关闭自动收集:

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

如果您想完全禁用Firebase崩溃报告,也不必添加

com.crashlytics.sdk.android:crashlytics:2.9.1
依赖项,然后按照的答案进行操作,但还要将其添加到您的AndroidManifest.xml中:

<application ...>

    // ...

    <meta-data 
            android:name="firebase_crashlytics_collection_enabled" 
            android:value="${enableCrashReporting}" />
    <meta-data
            android:name="firebase_analytics_collection_deactivated"
            android:value="true"/>
</application>


// ...

如果您切换到firebase crashlytics并删除fabric crashlytics,我认为也可以从代码中执行此操作:

因此,在应用程序类的onCreate中:

FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(!BuildConfig.DEBUG);

谢谢,但我没有使用firebase crash,因为它现在已被弃用。你提出的答案就是这样的。我正在使用crashlytics,它只是与firebase控制台连接。再次感谢,但出于几个原因,我需要在运行时执行此操作。知道为什么
.disabled
不起作用吗?它在我没有连接Firebase的其他应用程序中工作得很好。这似乎是一个firebase Bug,不是吗?您需要在gradle中执行
ext.enableCrashlytics=false
,并禁用
crashlyticcore-crashlyticcore=new-crashlyticcore.Builder();Fabric.with(这是新的Crashlytics.Builder().core(crashlyticcore.build())在应用程序类中很遗憾,没有。它仍然部署在调试模式下产生的崩溃。我还尝试使用firebase\u crashlytics\u集合在清单中禁用它_enabled@peshkira你最终找到了适合你的解决方案吗?@Shobhit Puri是的。看一看被接受的答案谢谢,我会再试一次。是几个问题共同导致了这个问题。你的回答帮助我解决了这些问题,所以我接受了。非常感谢。我自己也有同样的问题,这个解决方案似乎还不够。我已经添加了元数据,在日志中没有“CrashlyticsInitProvider初始化成功”,我已经四次检查了
Fabric.with(这是新的Crashlytics())
只在非调试版本上调用,我有SDK的2.9.3版,我仍然收到崩溃报告。请帮助-如果没有其他事情要做,我将尝试下面提到的基于gradle的解决方案。不幸的是,我尝试了这个,似乎不再有效<代码>CrashlyticsInitProvider:CrashlyticsInitProvider初始化成功
不再显示在调试版本的日志中,但崩溃仍会发送到我的控制台
firebase\u core\u version='16.0.5'
firebase\u crashlytics\u version='2.9.6'
从最新的crashlytics打印出来
I/crashlyticcore:initialized crashlytics 2.6.6.29
谢谢,我会再试一次。ext.enablecashlytics=false这行正在用下面的消息使我的应用程序崩溃
<application ...>

    // ...

    <meta-data 
            android:name="firebase_crashlytics_collection_enabled" 
            android:value="${enableCrashReporting}" />
    <meta-data
            android:name="firebase_analytics_collection_deactivated"
            android:value="true"/>
</application>
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(!BuildConfig.DEBUG);