Answers:
来自Crashlytics的Marc。在进行调试构建时,有两种禁用Crashlytics的方法!
使用其他android:versionString进行调试和发布,然后从Crashlytics Web仪表板禁用调试版本的崩溃报告。
将对Crashlytics.start()的调用包装在检查调试标志的if语句中。您可以使用自定义标志,也可以使用此处提出的方法:如何检查APK是否已签名或“调试”?
BuildConfig.DEBUG
如果使用Gradle进行构建,则应使用。它将始终正确生成。
BuildConfig.DEBUG
?
我从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不推荐使用的方法disable()复制)
编辑2:
您也可以选择将此选项添加到buildType
gradle中。该命令禁用发送crashlytics映射文件并为每个构建生成ID,从而加快了这些风味的gradle构建。(它不会在运行时禁用Crashlytics。)请参阅此处的Mike B的答案。
buildTypes {
release {
....
}
debug {
ext.enableCrashlytics = false
}
}
ext.enableCrashlytics = false
2.5也不适合我。实际上,它从未奏效。甚至在面料之前。
选择的答案不再正确。Google 更改了 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无法正常工作,因为在Debug Builds中找不到Crashlytics类。因此,将Gradle实现更改为:
implementation 'com.crashlytics.sdk.android:crashlytics:2.9.1' // update version
然后转到清单,然后在meta-data
标签内添加以下application
标签:
<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");
}
Enable collection for selected users by initializing Crashlytics from one of your app's activities
但是我猜如果您在应用程序中初始化Crashlytics不会有太大变化。你试过了吗?如果有效,则可以将其添加到我的答案中。 firebase.google.com/docs/crashlytics/customize-crash-reports
firebase_crashlytics_collection_enabled
在清单中设置为false时,崩溃不会出现在控制台上(我使用v2.9.9)。因此,我通过添加单独的清单(用于调试构建firebase_crashlytics_collection_enabled=false
和true
发布)来解决此问题
如果您使用Gradle,只需将其添加到风味中:
ext.enableCrashlytics = false
This app relies on Crashlytics.
”
查看最新文档。 https://docs.fabric.io/android/crashlytics/build-tools.html#gradle-advanced-setup。
除了ext.enableCrashlytics = false
需要添加build.grade 之外,
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);
This app relies on Crashlytics. Please sign up for access at
ext.enableCrashlytics = false
在build.gradle 中丢失了。
buildTypes -> debug, also i'm applying the plugin via
apply插件中:'io.fabric'`
This app relies on Crashlytics. Please sign up for access at https://fabric.io/sign_up
我发现这是最简单的解决方案:
release {
...
buildConfigField 'Boolean', 'enableCrashlytics', 'true'
}
debug {
buildConfigField 'Boolean', 'enableCrashlytics', 'false'
}
上面的几行将enableCrashlytics
在BuildConfig
文件中创建一个静态布尔字段,您可以使用该布尔字段来决定是否启动Fabric
:
if (BuildConfig.enableCrashlytics)
Fabric.with(this, new Crashlytics());
注意:使用此方法时,仅在发布版本中初始化Fabrics(如以上代码所示)。这意味着您需要将对Crashlytics
类的statics方法的调用放在一个if
块中,该块检查Fabrics是否已初始化,如下所示。
if (Fabric.isInitialized())
Crashlytics.logException(e);
否则Must Initialize Fabric before using singleton()
,在模拟器上进行测试时,应用程序将崩溃并显示错误。
2019年答案
我一直在尝试仅在发布中启用Crashlytics并在调试中禁用2小时,检查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
}
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)
android:value="false"
必须更改为android:value="${enableCrashlytics}"
。是不是
在此使用 MyApplication#onCreate()
if (!BuildConfig.DEBUG) Crashlytics.start(this);
编辑 如果您已升级到Fabric,请改用此答案。
BuildConfig
是由Gradle任务生成的,可以保证运行。我还用于buildConfigField
设置自定义字段,并且这些字段始终有效。tools.android.com/recent/androidstudio045released也建议您使用BuildConfig.DEBUG
。
我喜欢的另一个简单解决方案,因为它不需要其他清单文件:
第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}" />
请注意,您还可以在调试版本中禁用讨厌的符号上传:
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
您的应用程序模块中即可。
如果要捕获所有崩溃(用于调试和发布版本),但想在“崩溃分析仪表板”中将它们分开,则可以将以下代码行添加到build.gradle中:
debug {
versionNameSuffix "-DEBUG"
}
例如,如果您的应用的versionName为1.0.0,则您的发行版本将被标记为1.0.0,而调试版本将被标记为1.0.0-DEBUG
这里有很多不错的答案,但是对于我的测试,我使用调试版本进行内部Beta和实验室之外的测试,在这些测试中,崩溃日志仍然非常有用,我仍然想报告它们。像OP一样,我想要做的就是在经常引起崩溃并迅速解决崩溃的主动开发过程中禁用它们。
除了删除所有调试崩溃外,您还可以选择仅在使用以下代码将设备连接到开发计算机时禁用报告。
if (!Debug.isDebuggerConnected()) {
Fabric.with(this, new Crashlytics());
}
使用Gradle构建时,最新最简单的版本:
if (!BuildConfig.DEBUG) {
Fabric.with(this, new Crashlytics());
}
它使用来自Fabric的Crashlytics的新内置语法,并自动与Gradle构建一起使用。
我遇到了一个奇怪的问题:我遵循了xialin的回答(也出现在官方网站上),但没有用。原来,我是BuildConfig
在Fabric的程序包中引用的,该程序包还包含一个静态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类中添加了该变量的原因。
初始化面料:
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);
ext.enableCrashlytics
,ext.alwaysUpdateBuildId
因为似乎没有在任何地方引用它们。我想念什么吗?
您可以将专用清单文件用于调试模式(适用于Crashlytics 2.9.7):
创建文件app/src/debug/AndroidManifest.xml
并添加以下内容:
<application>
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false"/>
</application>
请注意,这个元数据元素必须投入调试/ AndroidManifest.xml中唯一的,并没有进入正规的AndroidManifest.xml
使用的解决方案CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()
对我不起作用,我发现在调用Application.onCreate()或启动任何活动之前,由CrashlyticsInitProvider初始化了crashlytics,这意味着在应用程序或活动中手动初始化结构没有效果,因为结构已经初始化。
步骤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
这项工作对我来说:
releaseCompile 'com.crashlytics.sdk.android:crashlytics:2.9.9'
并在buildTypes中:
debug {
ext.enableCrashlytics = false
}
为了禁用以下版本com.google.firebase:firebase-crashlytics:17.0.0的Firebase Crashlytics,有两个选项:
<meta-data android:name="firebase_crashlytics_collection_enabled" android:value="false" />
要么
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true)
将此添加到应用程序的build.gradle中:
android {
buildTypes {
debug {
// Disable fabric build ID generation for debug builds
ext.enableCrashlytics = false
...
在运行时禁用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);
在AndroidManifest.xml中,添加
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false" />
2020后织物答案
将以下代码粘贴到Application类中,然后setCrashlyticsState
从应用程序onCreate 调用该方法。您可以选择将测试设备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类。通常有几种选择,而错误的选择可能会被拖入。