有没有简单的方法可以在开发时关闭Crashlytics Android SDK?
每次我做一些愚蠢的事情时,我都不希望它发送崩溃
另一方面,我不想评论Crashlytics.start()
,并可能冒险忘记取消注释并提交
来自Crashlytics的Marc来自这里。在进行调试构建时,有几种方法可以禁用Crashlytics!
这里有很多好的答案,但对于我的测试,我使用调试版本进行内部测试和实验室外测试,其中崩溃日志仍然非常有用,我仍然想报告它们。和OP一样,我想要的只是在我经常引起并快速解决崩溃的活动开发期间禁用它们。
您可以选择仅在使用以下代码将设备连接到开发计算机时禁用所有调试崩溃,而不是删除所有调试崩溃。
if (!Debug.isDebuggerConnected()) {
Fabric.with(this, new Crashlytics());
}
我喜欢的另一个简单的解决方案,因为它不需要不同的清单文件:
第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
即可。
问题是没有一个解决方案适用于最新的crashlytics sdk。 (我使用的是2.9.0)
您无法通过代码禁用它,因为它会编译到您的项目中,甚至在调用应用程序的onCreate之前运行。所以其他解决方案很简单 - 不需要时不要编译crashlytics。用build.gradle文件中的'releaseCompile'替换'compile'调用。
releaseCompile('com.crashlytics.sdk.android:crashlytics:2.9.0@aar') {
transitive = true
}
使用Gradle构建时最新最简单的版本:
if (!BuildConfig.DEBUG) {
Fabric.with(this, new Crashlytics());
}
它使用Fabric for Crashlytics的新内置语法,并自动使用Gradle构建。
我遇到一个奇怪的问题:我遵循了xialin的答案(也出现在官方网站上)并且它没有用。原来我在Fabric的包中引用了BuildConfig
,它还包含一个静态DEBUG变量,即使在调试模式下也设置为false。
因此,如果您遵循上述解决方案并仍然获得调试报告,请确保您引用此:
import com.yourpackagename.BuildConfig;
而不是这个:
import io.fabric.sdk.android.BuildConfig;
2019答案
我一直在尝试仅在发布时启用Crashlytics并在调试中禁用2小时,检查Firebase控制台以查看是否上传了例外情况。
有两种方法可以做到这一点。
它工作,但如果你在调试版本上调用任何Crashlytics
方法,应用程序将崩溃。
应用程序/的build.gradle
android {
buildTypes {
release {
manifestPlaceholders = [crashlyticsEnabled: true]
}
release {
manifestPlaceholders = [crashlyticsEnabled: false]
}
AndroidManifest.xml中
<manifest
<application
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="${crashlyticsEnabled}" />
如果允许您在不先检查Crashlytics
的情况下调用BuildConfig.DEBUG
方法的替代方法。使用此设置,您可以安全地调用Crashlytics.logException()
之类的方法 - 它们在调试版本中根本不执行任何操作。我没有看到报告是在调试中上传的。
应用程序/的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)
如果你担心没有正确设置BuildConfig.DEBUG
,请改用ApplicationInfo
:
boolean isDebug = ( mAppContext.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) != 0;
Crashlytics crashlytics = new Crashlytics.Builder().disabled( isDebug ).build();
Fabric.with( uIContext, crashlytics );
使用口味或构建配置。为开发构建使用单独的构建标识符,所有崩溃将继续使用单独的应用程序。在与同行共享构建或在没有调试器的情况下使用它时,可以派上用场。像这样的东西 -
productFlavors {
dev {
applicationId "io.yourapp.developement"
}
staging {
applicationId "io.yourapp.staging"
}
production {
applicationId "io.yourapp.app"
}
如果你想要一个可调试的版本,那就是这样的:
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 Fabric:
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的解决方案(与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 deprecated method disabled()复制)
Aaditi:
您也可以选择将其添加到gradle中的buildType
中。此命令禁用发送crashlytics映射文件并为每个构建生成ID,从而加快这些类型的gradle构建。 (它不会在运行时禁用Crashlytics。)See Mike B's answer here.
buildTypes {
release {
....
}
debug {
ext.enableCrashlytics = false
}
}
我们可以使用fabric的isDebuggable()方法。
import static io.fabric.sdk.android.Fabric.isDebuggable;
if(! isDebuggable()){
// set Crashlytics ...
}
快乐编码:)
您可以使用专用的清单文件进行调试模式(适用于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()
的解决方案对我不起作用,我发现在调用Application.onCreate()或启动任何活动之前,CrashlyticsInitProvider初始化了crashlytics,这意味着在应用程序或活动中手动初始化fabric没有效果,因为织物已经初始化。
如果您只想在IDE上执行此操作,另一种方法是注销插件。显然,当你在没有再次登录的情况下生成构建时,它将停止发送报告。
第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
android {
buildTypes {
debug {
// Disable fabric build ID generation for debug builds
ext.enableCrashlytics = false
...
// 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);
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false" />
这项工作对我来说:
releaseCompile 'com.crashlytics.sdk.android:crashlytics:2.9.9'
在buildTypes中:
debug {
ext.enableCrashlytics = false
}
我知道这是愚蠢的答案
只需注释掉Fabric.with(this, new Crashlytics());
,就可以解决这个问题,并在想要发布它时取消注释。
选择的答案不再正确。 Crashlytics的谷歌changed the integration。我当前的版本是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
如果你想要additionally configure Crashlytics,那么解决方案1不能正常工作,因为在Debug Builds中找不到Crashlytics类。因此,将Gradle实现更改回:
implementation 'com.crashlytics.sdk.android:crashlytics:2.9.1' // update version
然后转到您的Manifest并在meta-data
标记内添加以下application
标记:
<application
android:name="...>
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false" />
...
</application>
添加到您的Launch-Activity(只需要一次性,而不是每个Activity)
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");
}
如果你使用Gradle,只需添加一个味道:
ext.enableCrashlytics = false
查看最新的文档。 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);
我发现this是最简单的解决方案:
release {
...
buildConfigField 'Boolean', 'enableCrashlytics', 'true'
}
debug {
buildConfigField 'Boolean', 'enableCrashlytics', 'false'
}
上面的行将在enableCrashlytics
文件中创建一个名为BuildConfig
的静态布尔字段,您可以使用它来决定是否启动Fabric
:
if (BuildConfig.enableCrashlytics)
Fabric.with(this, new Crashlytics());
注意:使用此方法,仅在发布版本中初始化Fabrics(如上面代码中所示)。这意味着您需要在Crashlytics
块中调用if
类中的静态方法,该块检查Fabrics是否已初始化,如下所示。
if (Fabric.isInitialized())
Crashlytics.logException(e);
否则,在模拟器上进行测试时,应用程序将因Must Initialize Fabric before using singleton()
错误而崩溃。
在MyApplication#onCreate()
中使用它
if (!BuildConfig.DEBUG) Crashlytics.start(this);
编辑如果您升级到Fabric,请使用此answer。
如果要捕获所有崩溃(用于调试和发布版本)但希望在Crashlytics仪表板中将它们分开,可以将此行代码添加到build.gradle:
debug {
versionNameSuffix "-DEBUG"
}
例如,如果您的应用程序的versionName是1.0.0,那么您的发布版本将标记为1.0.0,而调试版本将为1.0.0-DEBUG