在开发过程中有没有简单的方法可以关闭Crashlytics Android SDK?
我不想每次做傻事都发送一份崩溃报告。
另一方面,我也不想注释掉Crashlytics.start()
,可能会忘记取消注释并提交代码。
在开发过程中有没有简单的方法可以关闭Crashlytics Android SDK?
我不想每次做傻事都发送一份崩溃报告。
另一方面,我也不想注释掉Crashlytics.start()
,可能会忘记取消注释并提交代码。
我从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已弃用的disabled()方法)
编辑2:
您还可以选择将此命令添加到gradle中的buildType
。 此命令禁用发送crashlytics映射文件并为每个构建生成ID,从而加快这些flavor的gradle构建速度。(它不会在运行时禁用Crashlytics。) 请参阅Mike B的答案。
buildTypes {
release {
....
}
debug {
ext.enableCrashlytics = false
}
}
ext.enableCrashlytics = false
对我来说也不起作用,即使在2.5版本之前,实际上它从来没有起作用过,甚至在Fabric之前。 - Bao-Long Nguyen-Trong来自Crashlytics的Marc。以下是在进行调试构建时禁用Crashlytics的几种方法!
为调试和发布构建使用不同的android:versionString,然后在Crashlytics Web控制面板中禁用调试版本的崩溃报告。
将对Crashlytics.start()的调用包装在检查调试标志的if语句中。您可以使用自定义标志或类似于此处提出的方法:如何检查APK是否已签名或为“debug build”?
BuildConfig.DEBUG
。它将始终被正确地生成。 - Austyn MahoneyBuildConfig.DEBUG
进行内部检查吗? - akhy2.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将不起作用,因为在Debug Builds中找不到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。要小心,配置Crashlytics时还要检查BuildConfig.DEBUG,例如:
if (!BuildConfig.DEBUG) {
Crashlytics.setUserIdentifier("HASH_ID");
}
firebase_crashlytics_collection_enabled
设置为 false 时,控制台上就不会出现崩溃信息(我使用的是 v2.9.9 版本)。因此,我通过添加一个专门针对调试版本的清单文件来解决了这个问题,其中 firebase_crashlytics_collection_enabled
的值分别设置为 false 和 true。 - Vasily Kabunov如果您使用Gradle,只需将以下内容添加到Flavor中:
ext.enableCrashlytics = false
这款应用程序依赖于Crashlytics。
" - Sakiboy请查看最新文档。 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);
ext.enableCrashlytics = false
。 - Abhishek PatidarbuildTypes -> debug
中,同时我也通过 apply plugin: 'io.fabric'
应用了插件。 - Kostadin Georgiev我发现这个是最简单的解决方案:
release {
...
buildConfigField 'Boolean', 'enableCrashlytics', 'true'
}
debug {
buildConfigField 'Boolean', 'enableCrashlytics', 'false'
}
if (BuildConfig.enableCrashlytics)
Fabric.with(this, new Crashlytics());
注意: 使用这种方法,Fabrics 仅在发布版本中初始化(如上面的代码所示)。这意味着您需要将对静态方法的调用放置在一个 if
块中,该块检查 Fabrics 是否已被初始化,如下所示。
if (Fabric.isInitialized())
Crashlytics.logException(e);
2019年答案
我花了2个小时尝试只在发布版本中启用Crashlytics,在调试版本中禁用,并检查Firebase控制台以查看异常是否已上传。
有两种可能的方法。
这是可行的,但如果您在调试构建上调用任何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}" />
一种替代方法,可以让您在调用 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)
android:value="false"
必须更改为android:value="${enableCrashlytics}"
。不是吗? - JaydeepW在MyApplication#onCreate()
中使用此功能。
if (!BuildConfig.DEBUG) Crashlytics.start(this);
编辑 如果你升级到了Fabric,请使用这个答案。
BuildConfig
是由Gradle任务生成的,这是有保证运行的。我还使用buildConfigField
来设置自定义字段,这些字段总是有效的。http://tools.android.com/recent/androidstudio045released 还建议您使用BuildConfig.DEBUG
。 - Austyn Mahoney我喜欢的另一种简单解决方案,因为它不需要不同的清单文件:
步骤1-在build.gradle中定义清单占位符。
android {
...
buildTypes {
release {
manifestPlaceholders = [crashlytics:"true"]
}
debug {
manifestPlaceholders = [crashlytics:"false"]
}
}
...
}
第二步-在AndroidManifest.xml中使用它们
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="${crashlytics}" />
2022年使用FirebaseCrashlytics的答案。
有两种情况:
firebase_crashlytics_collection_enabled
设置为false
来禁用它。build.gradle(:app)
// 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}" />
为处理该情况,你应该使用setCrashlyticsCollectionEnabled
方法。
Kotlin API(Java API相似):
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(false)
当设置为false时,新值直到下一次应用程序运行才会生效。
参考资料:
extra["enableCrashlytics"] = false
,但它没有起作用。 - Mark