我已成功实施Firebase崩溃报告,但我需要在应用运行时停用该服务撤消“调试”#39;构建变体,以避免在开发过程中控制台中出现非真实崩溃。
官方文件没有说明这一点。
答案 0 :(得分:46)
更新:
借助Google Play Services / Firebase 11+,您现在可以在运行时禁用崩溃报告。 FirebaseCrash.setCrashCollectionEnabled()
(谢谢@Tyler Carberry)
老答案:
就社区能够推测而言,没有官方支持。我建议这样做的最佳方法是,在信息中心设置多个Firebase应用,每个版本类型一个,并根据构建版本设置多个指向每个不同应用的google_services.json文件。
答案 1 :(得分:29)
借助Google Play Services 11.0,您现在可以在运行时禁用崩溃报告。
FirebaseCrash.setCrashCollectionEnabled(!BuildConfig.DEBUG);
答案 2 :(得分:23)
Recently介绍了以官方方式停用Firebase崩溃报告的可能性。您需要将firebase android sdk升级到至少版本11.0.0
为此,您需要修改AndroidManifest.xml
并添加:
<meta-data
android:name="firebase_crash_collection_enabled"
android:value="false" />
在<application>
区块内。
您可以使用FirebaseCrash.isCrashCollectionEnabled()检查运行时是否启用了Firebase崩溃报告。
下面是一个完整的示例,用于在调试版本中禁用Firebase崩溃报告。
<强>的build.gradle 强>:
...
buildTypes {
release {
...
resValue("bool", "FIREBASE_CRASH_ENABLED", "true")
}
debug {
...
resValue("bool", "FIREBASE_CRASH_ENABLED", "false")
}
}
...
dependencies {
...
compile "com.google.firebase:firebase-core:11.0.0"
compile "com.google.firebase:firebase-crash:11.0.0"
...
}
<强>的AndroidManifest.xml 强>:
<application>
<meta-data
android:name="firebase_crash_collection_enabled"
android:value="@bool/FIREBASE_CRASH_ENABLED"/>
...
答案 3 :(得分:11)
在我的Application类中,onCreate()
if (BuildConfig.DEBUG) {
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
Log.wtf("Alert", paramThrowable.getMessage(), paramThrowable);
System.exit(2); //Prevents the service/app from freezing
}
});
}
它的工作原理是因为它需要oldHandler,其中包含Firebase一个
final UncaughtExceptionHandler oldHandler = Thread.getDefaultUncaughtExceptionHandler();
超出处理路径
答案 4 :(得分:11)
您可以将firebase崩溃依赖项更改为仅发布依赖项。
为此,您将其定义为releaseCompile依赖项
releaseCompile 'com.google.firebase:firebase-crash:9.4.0'
现在它只会包含在发布版本中。如果您有其他想要崩溃报告的自定义构建类型,可以将其添加到。
customBuildTypeCompile 'com.google.firebase:firebase-crash:9.4.0'
答案 5 :(得分:9)
我使用的简单易用的技巧是仅在build.gradle
文件中的发布版本中添加firebase崩溃报告依赖项。
这将从调试版本类型中删除崩溃报告库,并仅在发布版本中添加它。
dependencies {
releaseCompile 'com.google.firebase:firebase-crash:10.2.0'
}
答案 6 :(得分:7)
受到this related answer和其他人的启发,我提出了这个方便的解决方案。
使用Timber进行日志记录,我为调试和发布版本创建了一个Tree子类的不同实现。在调试中,它遵循写入logcat的DebugTree。在发布时,它会将异常和高优先级日志转发给Firebase,其余部分将丢弃。
<强>的build.gradle 强>
dependencies {
...
compile 'com.jakewharton.timber:timber:4.3.0'
releaseCompile 'com.google.firebase:firebase-crash:9.0.2'
}
<强> SRC /调试/ JAVA / [包] /ForestFire.java 强>
import timber.log.Timber;
public class ForestFire extends Timber.DebugTree {}
<强>的src /释放/ JAVA / [包] /ForestFire.java 强>
import android.util.Log;
import com.google.firebase.crash.FirebaseCrash;
import timber.log.Timber;
public class ForestFire extends Timber.Tree {
@Override
protected void log(int priority, String tag, String message, Throwable t) {
if (Log.WARN <= priority) {
FirebaseCrash.log(message);
if (t != null) {
FirebaseCrash.report(t);
}
}
}
}
应用启动
Timber.plant(new ForestFire());
答案 7 :(得分:6)
首先初始化gradle文件中的变量,并检查它是处于调试模式还是处于释放模式。提交崩溃报告的最佳方法是在Application类中。
<强>的build.gradle 强>
buildTypes {
release {
buildConfigField "Boolean", "REPORT_CRASH", '"true"'
debuggable false
}
debug {
buildConfigField "Boolean", "REPORT_CRASH", '"false"'
debuggable true
}
}
现在首先检查模式并在崩溃时提交崩溃报告。
<强> Application.java 强>
/** Report FirebaseCrash Exception if application crashed*/
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException (Thread thread, Throwable e)
{
/** Check whether it is development or release mode*/
if(BuildConfig.REPORT_CRASH)
{
FirebaseCrash.report( e);
}
}
});
答案 8 :(得分:4)
目前,您无法停用firebase崩溃报告,但您可以停用firebase分析。
所以一种方法是在同一个firebase项目中创建另一个具有不同ID的应用程序。在此之后,您只需更改appID即可启用或禁用firebase崩溃报告。为方便起见,我在下面创建了两个应用程序:
AppID:com.android - 适用于发布版本类型
AppID:com.android.debug - 对于调试版本类型
请点击以下链接了解更多详情:
https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html
修改强> 你不需要一次又一次地在android项目中更改appID。有一种更好的方法可以将不同的appID用于调试构建类型 -
android {
defaultConfig {
applicationId "com.android"
...
}
buildTypes {
debug {
applicationIdSuffix ".debug"
}
}
}
查看链接以获取更多详细信息:
https://developer.android.com/studio/build/application-id.html
<强> EDIT2:强>
基本上在上面的解决方案中,您在Firebase项目中创建了两个不同的应用程序,这样您就可以分离开发和生产错误。
不推荐使用FYI Firebase崩溃报告。您应该使用Fabrics Crashlytics(由Google拥有)。它有一些非常酷的功能。
答案 9 :(得分:2)
FirebaseAnalytics
课程。
禁用收集:setAnalyticsCollectionEnabled(false);
启用集合:setAnalyticsCollectionEnabled(true);
或写入应用程序标记中的AndroidManifest.xml
:<meta-data android:name="firebase_analytics_collection_enabled" android:value="false" />
可能的用途:
if (BuildConfig.DEBUG){ //disable for debug
mFirebaseAnalytics.setAnalyticsCollectionEnabled(false);
}
答案 10 :(得分:1)
首先,您必须创建debug
和release
构建变体,然后使用布尔值设置变量。然后,您需要从扩展application
的java文件中获取该值,即从启用Fabric
崩溃报告的位置获取该值。
下面给出了一个代码示例。
在您应用的build.gradle
文件中,添加以下行以创建2个构建变体debug
和release
,然后添加一个带有布尔值的变量。
defaultConfig {
buildConfigField 'boolean', 'ENABLE_ANALYTICS', 'true'
}
buildTypes {
debug {
applicationIdSuffix ".debug"
versionNameSuffix 'DEBUG'
buildConfigField 'boolean', 'ENABLE_ANALYTICS', 'false'
}
release {
minifyEnabled false
}
}
然后,当您尝试添加Fabric
崩溃报告时,请检查ENABLE_ANALYTICS
public class Test扩展了Application {
private GoogleAnalytics googleAnalytics;
private static Tracker tracker;
@Override
public void onCreate() {
super.onCreate();
if (BuildConfig.ENABLE_ANALYTICS)
Fabric.with(this, new Crashlytics());
}
}
您可以通过ENABLE_ANALYTICS
+点击该值查看ctrl
的值。希望这会有所帮助。
答案 11 :(得分:0)
我使用versionCode
作为本地/生产版本的过滤器。
<强> gradle.properties 强>
VERSION_CODE=1
应用/的build.gradle 强>
android {
defaultConfig {
versionCode VERSION_CODE as int
}
}
发布新版app时,只需从命令行设置新值:
./gradlew build -PVERSION_CODE=new_value
否则,当您从Android Studio构建时,您将始终获得相同的versionCode
,因此您可以轻松区分Firebase控制台中的崩溃报告。
答案 12 :(得分:0)
如前所述 - 没有正式的方法可以做到这一点。但是我提到的最糟糕的解决方法@ mark-d是重置DefaultUncaughtExceptionHandler
(https://stackoverflow.com/a/39322734/4245651)。
但是,如果您只是按照建议调用System.exit(2)
- 应用程序将立即关闭异常,没有任何对话框消息并且很难获得调试日志。如果这对您很重要,有一种方法可以恢复默认处理程序:
if (BuildConfig.DEBUG) {
final Thread.UncaughtExceptionHandler currentHandler = Thread.getDefaultUncaughtExceptionHandler();
if (currentHandler.getClass().getPackage().getName()
.startsWith("com.google.firebase")) {
final Thread.UncaughtExceptionHandler defaultHandler =
getPrivateFieldByType(currentHandler, Thread.UncaughtExceptionHandler.class);
Thread.setDefaultUncaughtExceptionHandler(defaultHandler);
}
}
其中
public static <T> T getPrivateFieldByType(Object obj, Class<T> fieldType) {
if (obj != null && fieldType != null) {
for (Field field : obj.getClass().getDeclaredFields()) {
if (field.getType().isAssignableFrom(fieldType)) {
boolean accessible = field.isAccessible();
if (!accessible) field.setAccessible(true);
T value = null;
try {
//noinspection unchecked
value = (T) field.get(obj);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
if (!accessible) field.setAccessible(false);
return value;
}
}
}
return null;
}
答案 13 :(得分:0)
<div>
Hello, <span id="name" />
</div>
<script type="text/javascript">
document.getElementById('name').textContent = localStorage.getItem('name');
</script>
答案 14 :(得分:0)
用户在调试模式或发布模式下运行应用程序时最简单的解决方案:
AndroidManifest.xml:
<meta-data
android:name="firebase_crash_collection_enabled"
android:value="${analytics_deactivated}"/>
build.gradle(Module:app)
buildTypes {
debug {
manifestPlaceholders = [analytics_deactivated: "false"]
}
release {
manifestPlaceholders = [analytics_deactivated: "true"]
}
}
因此,当应用程序处于发布模式时,crashlatics将被打开,而对于处于发布模式的应用程序,将被关闭
答案 15 :(得分:0)
我想最近的firebase crashlytics都有此实现。
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(!BuildConfig.DEBUG)