无法为 DEBUG 版本禁用 Fabric 的 Crashlytics with Firebase
Posted
技术标签:
【中文标题】无法为 DEBUG 版本禁用 Fabric 的 Crashlytics with Firebase【英文标题】:Fabric's Crashlytics with Firebase can't be disabled for DEBUG builds 【发布时间】:2018-09-06 19:13:06 【问题描述】:我有一个通过 Firebase 使用 Fabric 的 Crashlytics 的应用。 以下是在我的 Applications onCreate 中执行的第一件事
CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder()
.disabled(BuildConfig.DEBUG)
.build();
Fabric.with(this, new Crashlytics.Builder().core(crashlyticsCore).build());
不过,崩溃是在DEBUG == true
模式下提交的。
我使用以下版本
在我的 build.gradle
classpath "io.fabric.tools:gradle:1.25.1"
在我的 app/build.gradle
implementation "com.crashlytics.sdk.android:crashlytics:2.9.1"
不幸的是,仍然会报告崩溃。任何想法,我做错了什么?
【问题讨论】:
***.com/a/37396946/7505436 谢谢,但我没有使用 firebase-crash,因为它现在已被弃用。您提出的答案使用了它。我正在使用 crashlytics,它只是与 firebase 控制台连接。 【参考方案1】:Bob Snyder 和 niqueco 已经发布了正确答案,但是每次构建实际发布 APK 时更改元数据值似乎有点乏味,因此这里有一个使用所谓的 manifestPlaceholder 和根据buildType
,将值自动更改为true
或false
。
将以下内容添加到您的应用中build.gradle
android
// ...
buildTypes
debug
manifestPlaceholders = [enableCrashReporting:"false"]
release
manifestPlaceholders = [enableCrashReporting:"true"]
这个给你的AndroidManifest.xml
<manifest ... >
<application ...>
// ...
<meta-data android:name="firebase_crashlytics_collection_enabled" android:value="$enableCrashReporting" />
</application>
</manifest>
打开 AndroidManifest.xml 后,您可以通过单击 Merged Manifest
选项卡来验证当前值。您应该会看到如下内容:
【讨论】:
它链接了解释推理的其他答案,它还提供了一个干净的解决方案。 最佳和更通用的方法。谢谢:) 是的,我就是这样做的。我赞成你的回答。但是,我将接受的答案保留原样,因为它为我指出了正确的解决方案。 这是一个不错的解决方案!【参考方案2】:Firebase Crashlytics documentation 解释说,一旦在应用会话中启用报告,就无法禁用它。
默认情况下,在创建 Application
实例之前执行的名为 CrashlyticsInitProvider 的 ContentProvider
中启用 Crashlytics 报告。 CrashlyticsInitProvider 启用或禁用基于元数据值 firebase_crashlytics_collection_enabled
的报告,默认情况下为 true。
如果您希望禁用报告,清单元数据必须存在并将其设置为 false:
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false" />
在应用初始化期间查看 logcat 中的消息:
CrashlyticsInitProvider: CrashlyticsInitProvider initialization successful
如果消息存在,firebase_crashlytics_collection_enabled
为真。如果消息不存在,则您已成功设置元数据以禁用崩溃报告。
如果元数据丢失或设置为 true,则无法通过调用 Fabric.with(...)
在代码中禁用报告。
在对另一个答案的评论中,您表示您尝试使用元数据禁用报告但未成功。检查拼写错误并确保声明正确放置在 <application>
元素中。在我的测试中,我能够使用元数据禁用报告,然后在运行时启用。
【讨论】:
谢谢,我再试一次。 是几个问题共同导致了问题。您的回答帮助我解决了这些问题,所以我接受了。谢谢! 我自己也有同样的问题,这个解决方案似乎还不够。我已经添加了元数据,我在日志中没有“CrashlyticsInitProvider 初始化成功”,我已经四次检查Fabric.with(this, new Crashlytics());
仅在非调试版本中调用,我有版本 2.9.3 的 SDK,我我仍然收到崩溃报告。请帮忙 - 如果没有别的事可做,我会尝试下面提到的基于 gradle 的解决方案。
我试过了,不幸的是,它似乎不再起作用了。 CrashlyticsInitProvider: CrashlyticsInitProvider initialization successful
不再显示在 DEBUG 构建的日志中,但崩溃仍然发送到我的控制台。 firebase_core_version = '16.0.5'
& firebase_crashlytics_version = '2.9.6'
从最新的 Crashlytics 开始,它会打印出 I/CrashlyticsCore: Initializing Crashlytics 2.6.6.29
【参考方案3】:
我终于找到了问题所在。 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>
我还通过添加以下内容在应用模块 gradle 构建文件中禁用了 Crashlytics:
debug
ext.enableCrashlytics = false
令我惊讶的是,我不需要做 Fabric.with(...)
的事情。以上就够了。
一切正常:没有报告。
【讨论】:
谢谢,我再试一次。 ext.enableCrashlytics = false 此行正在使我的应用程序崩溃,并显示以下消息 - “此应用程序依赖于 Crashlytics。请通过 fabric.io/sign_up 注册访问,” @AjithMemana 这适用于旧的 Fabric Crashlytics。不是 Fabric 的 Crashlytics with Firebase,而是关于它的问题。为此,请查看已接受的答案【参考方案4】:我认为如果您切换到 firebase crashlytics 并删除了 fabric crashlytics ,也可以从代码中做到这一点: link to firebase doc
所以在你的应用程序类的 onCreate 中:
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(!BuildConfig.DEBUG);
【讨论】:
无法看到 dev 的崩溃。如何启用崩溃【参考方案5】:从 android 文档中获取此信息 Customize your Firebase Crash Reports
启用选择加入报告: 默认情况下,Firebase Crashlytics 会自动为您应用的所有用户收集崩溃报告。为了让用户更好地控制他们发送的数据,您可以改为启用选择加入报告。
为此,您必须禁用自动收集并仅为选择加入的用户初始化 Crashlytics。
在您的 AndroidManifest.xml 文件中使用元数据标签关闭自动收集:
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false" />
通过从您的应用活动之一初始化 Crashlytics 为选定用户启用收集:
Fabric.with(this, new Crashlytics());
【讨论】:
【参考方案6】:您需要禁用应用的 build.gradle 的 Crashlytics
。 Disable Crashlytics for Debug Builds
android
buildTypes
debug
// Disable fabric build ID generation for debug builds
ext.enableCrashlytics = false
...
【讨论】:
再次感谢,但出于几个原因,我需要在运行时执行此操作。知道为什么.disabled
不起作用吗?它在我没有连接 Firebase 的其他应用程序中运行良好。这似乎是一个 firebase 错误,不是吗?
你需要在你的gradle里做ext.enableCrashlytics = false
,在你的应用类里做CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder() .disabled(BuildConfig.DEBUG) .build(); Fabric.with(this, new Crashlytics.Builder().core(crashlyticsCore).build());
很遗憾,没有。它仍然部署在调试模式下产生的崩溃。我还尝试使用 firebase_crashlytics_collection_enabled 在清单中禁用它
@peshkira 你终于找到适合你的解决方案了吗?
@Shobhit Puri 是的。看看接受的答案【参考方案7】:
如果您想完全禁用 Firebase 崩溃报告并且也不必添加
com.crashlytics.sdk.android:crashlytics:2.9.1
依赖,然后按照@reVerse的回答,同时将其添加到您的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>
【讨论】:
以上是关于无法为 DEBUG 版本禁用 Fabric 的 Crashlytics with Firebase的主要内容,如果未能解决你的问题,请参考以下文章
Fabric Debug Craslytic 报告:注册,缺少构建 ID,应用插件:io.fabric
WCF:在 VS2010 中自动禁用 MEX 从 DEBUG 到 RELEASE 构建?
即使节点处于禁用状态,Fabric 集群中节点上的 RemoveNodeStateAsync() 也会失败。