Firebase crashlytics 不显示崩溃
Posted
技术标签:
【中文标题】Firebase crashlytics 不显示崩溃【英文标题】:Firebase crashlytics doesnt show crashes 【发布时间】:2019-05-28 20:13:54 【问题描述】:希望在应用崩溃后从 firebase 获取崩溃报告。是否可以在 firebase 崩溃中单独获取调试模式日志和单独的生产崩溃日志?...因为当我们从生产或调试测试中崩溃时,它并不是很清楚。 此外,发生崩溃后,firebase 不会在控制台上反映崩溃报告。 我应该怎么做才能获得最新的崩溃报告? 除了firebase之外,还有其他方法可以获得崩溃报告吗? 我已经更新了 firebase crashlytics 所需的库。 并跟随教程 - https://firebase.google.com/docs/crashlytics/get-started#android
【问题讨论】:
firebase 需要 24 小时才能显示崩溃报告。 感谢您的快速重播,但我在 24 小时后没有崩溃。那么,我该怎么办? @Urvishrana,我认为这不是真的,就我而言,崩溃会在 5 分钟内更新 是的@Zlytherin 通常它会在几分钟内反映出来。 @MeeraPotdar 关注此firebase.google.com/docs/crashlytics/get-started#android 【参考方案1】:是否可以在 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 的调用,然后可以在其中添加或更改底层报告平台。
【讨论】:
感谢您的指导。我想实施您的解决方案,如果需要任何帮助,请告知您。 你能解释一下如何制作同一个项目的多个 google-services.json 文件吗?我做了内部和生产两种风格,所以我需要根据应用程序 Id 创建两个 google-services.json 文件。我需要在 firebase 上创建两个不同的项目吗? 您添加到 Firebase 的每个应用都会获得一个google-services.json
。因此,与您将第一个应用程序添加到 Firebase 的方式相同,您可以使用 applicationIdSuffix
重复该风格。无论您是拥有两个独立的 Firebase 项目,还是将两种风格添加到同一个项目中,过程都是相同的。
我在 firebase 上创建了一个新项目以获取新的 google-service.json 文件。
是的,请参阅the documentation 了解如何设置。【参考方案2】:
Upgrade SDK
为迁移到新的SDK进行相关设置后,避免出现以下错误很重要:
尝试在崩溃时发送崩溃报告。
这可能是由于在 FirebaseCrashlytics 发送报告之前强制发生崩溃(在我的情况下没有监听按钮),也就是说,Crashlytics 报告端点上传完成。
Test implementation
启用 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) 第二步:强制崩溃(使用按钮或直接)。
MainActivity.kt
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
【讨论】:
【参考方案3】:如果您设置了自动收集日志,Firebase 将不会在 crashlytics 中区分调试版本和生产版本的日志/崩溃。如果应用程序 build.gradle 具有 debug:fasle 即生产,您可以使用日志库仅发送日志和崩溃。 您可以查看 Timber 日志库,其中包含添加崩溃报告的绝佳示例。 https://github.com/JakeWharton/timber
您必须在清单中禁用 crashlytics 的自动初始化才能控制何时将崩溃发送到 firebase
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false" />
然后在您的 Application 类的 onCreate
中检查 BuildConfig.DEBUG
是否为真,您将不会初始化 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,因为您可以在本地查看调试日志。
【讨论】:
非常感谢您的简短描述。我想先检查一下,它是否适合我。如果我需要任何帮助,请告诉您。【参考方案4】:请删除 fabric.properties 并删除所有与织物相关的行和文件
【讨论】:
【参考方案5】:感谢 AllwinJohnson 解决方案,我解决了这个问题: https://github.com/firebase/firebase-android-sdk/issues/1944
通过添加:FirebaseCrashlytics.getInstance() 在我的应用程序类中的 onCreate 中
【讨论】:
【参考方案6】:对我来说,问题在于模拟器本身。修复模拟器上的日期和时间为我做了这件事,因为它导致了CertificateNotYetValidException
。
【讨论】:
【参考方案7】:如果您从 Fabric SDK 迁移到 Firebase Crashlytics,这将有所帮助。 在您的 OnCreate() 中添加以下行运行应用并检查您的 firebase crashlytics 仪表板。
FirebaseCrashlytics.getInstance().sendUnsentReports();
【讨论】:
以上是关于Firebase crashlytics 不显示崩溃的主要内容,如果未能解决你的问题,请参考以下文章
Firebase Crashlytics 不显示仪表板/控制台 iOS 应用中的更改
显示flutter firebase crashlytics中发生了哪一行崩溃,并显示dart文件名
react-native-firebase crashlytics 未显示在 firebase 仪表板上
Firebase Crashlytics 未在门户上显示任何问题