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 未在门户上显示任何问题

必须上传一个 dSYM 文件始终显示在 Firebase Crashlytics 中

Flutter:Flutter Firebase Crashlytics 未针对 iOS 显示