想要在应用崩溃后从Firebase获取崩溃报告。是否有可能在Firebase崩溃中单独获得调试模式日志和生产崩溃日志?...因为当我们从生产或调试测试中崩溃时并不清楚。 此外,发生崩溃后,firebase不会在控制台上反映崩溃报告。 我应该怎么做才能获得最新的崩溃报告? 除了Firebase,还有其他方法可以获取崩溃报告吗? 我已经更新了Firebase crashlytics所需的库。 和后续教程-https://firebase.google.com/docs/crashlytics/get-started#android
答案 0 :(得分:3)
为迁移到新的SDK进行相关设置后,务必避免以下错误:
尝试在崩溃时发送崩溃报告。
这可能是由于在FirebaseCrashlytics发送报告之前强制崩溃(在我的情况下,没有按钮进行监听),也就是说, Crashlytics报告端点上传。
$ adb devices
$ adb shell setprop log.tag.FirebaseCrashlytics DEBUG
$ adb logcat -s FirebaseCrashlytics
1)第一步:不要强迫崩溃并运行该应用。观察如何在Crashlyticis logcat中对其进行正确初始化。
...
FirebaseCrashlytics: Update app request ID: 1d62cb...
FirebaseCrashlytics: Result was 204.
Crashlytics Reports Endpoint upload complete
2)第二步:(使用按钮或直接)强制崩溃。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setupCrashlytics()
...
}
private fun setupCrashlytics() {
throw RuntimeException("Test crash") //TODO: Clean
}
注意:生成报告的唯一必要条件就是依赖项之外的此代码。另外,您可以使用FirebaseCrashlytics.getInstance()
登录自定义键。
然后运行该应用程序并检查以下内容:
FirebaseCrashlytics: Crashlytics completed exception processing. Invoking default exception handler.
FirebaseCrashlytics: Attempting to send crash report at time of crash...
这时,异常过程已登录到Firebase服务器上,但是报告尚未发送到控制台,即,上传不完整。
3)最后,我们对崩溃崩溃进行清理或发表评论
private fun setupCrashlytics() {
//throw RuntimeException("Test crash")
}
运行应用,然后检查:
Attempting to send 1 report(s)
FirebaseCrashlytics: Settings result was: 200
FirebaseCrashlytics: Adding single file 5EDA9D7....cls to report 5EDA9D7...
FirebaseCrashlytics: Sending report to: https://reports.crashlytics.com/spi/v1/platforms/android/apps/.../reports
FirebaseCrashlytics: Crashlytics Reports Endpoint upload complete: 5EDABB42 ...
这可以确保报告到达控制台。
GL
答案 1 :(得分:1)
如果您设置了日志自动收集功能,Firebase将不会在crashlytics中的调试版本和生产版本日志/崩溃之间进行区分。仅当应用程序build.gradle具有debug:fasle即Production时,您才可以使用日志记录库发送日志和崩溃。 您可以查看Timber日志记录库,其中提供了添加崩溃报告的绝佳示例。 https://github.com/JakeWharton/timber
您必须禁用清单中的crashlytics的自动初始化,才能控制将崩溃发送到Firebase的时间
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false" />
然后在Application类的onCreate
中检查BuildConfig.DEBUG
是否为true,否则不会初始化crashlaytics,因此调试日志和异常不会进入firebase,只会导致生产崩溃。
对于木材,当您想将原木和崩溃物放到火基上时,可以使用此树:
/**
* {@link Timber.Tree} using {@link Crashlytics} as crash reporting
*/
private static class CrashReportingTree extends Timber.Tree {
CrashReportingTree(Context context) {
CrashlyticsCore core = new CrashlyticsCore.Builder()
.disabled(BuildConfig.DEBUG)
.build();
Fabric.with(context, new Crashlytics.Builder().core(core).build());
}
@Override
protected void log(int priority, String tag, @NonNull String message, Throwable t) {
// don't report log to Crashlytics if priority is Verbose or Debug
if (priority == Log.VERBOSE || priority == Log.DEBUG) {
return;
}
Crashlytics.log(priority, tag, message);
if (t != null) {
if (priority == Log.ERROR) {
Crashlytics.logException(t);
}
}
}
}
对于调试模式,您不应将崩溃发送给Firebase,因为可以在本地检查调试日志。
答案 2 :(得分:1)
请删除fabric.properties 并删除所有与fabric 相关的行和文件
答案 3 :(得分:0)
是否可以在Firebase崩溃中单独获得调试模式日志和生产崩溃日志?
这是一种常见的做法,甚至建议您创建一个单独的项目进行测试和生产。下载google-services.json
并将其放置在构建样式文件夹中
~/app/src/release/google-services.json
~/app/src/debug/google-services.json
即使您只有一个用于测试和生产的Firebase项目,如果您为开发版本设置了项目ID后缀,也可以按应用程序ID过滤日志:
〜/ app / build.gradle
buildTypes {
release {
}
debug {
applicationIdSuffix '.debug'
versionNameSuffix '-dbg'
}
}
在这里您可以看到Crashlytics中提供的不同口味
此外,发生崩溃后,firebase不会在控制台上反映崩溃报告。
首次设置crashlytics可能需要一些时间才能在仪表板上显示数据。但是,如果超过24小时,则可能是设置不正确。尝试explicitly trigger a crash以确保其正常工作。
Button crashButton = new Button(this);
crashButton.setText("Crash!");
crashButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Crashlytics.getInstance().crash(); // Force a crash
}
});
除了firebase之外,还有其他方法可以获取崩溃报告吗?
是的,如果需要,您可以拥有多个崩溃报告工具。您也许可以为崩溃报告创建包装类,在其中将对Crashlytics的调用抽象化,然后可以在其中添加或更改基础报告平台。
答案 4 :(得分:0)
感谢 AllwinJohnson 解决方案,我解决了这个问题: https://github.com/firebase/firebase-android-sdk/issues/1944
通过添加:FirebaseCrashlytics.getInstance() 在我的应用程序类中的 onCreate