没有调用Crashlytics Listener

问题描述 投票:3回答:2

我正在使用此代码来跟踪应用程序崩溃的时间:

val core = CrashlyticsCore
                .Builder()
                .listener {
                    Log.d("***", "Crash happened")
                }
                .build()
        val crashlyticsKit = Crashlytics
                .Builder()
                .core(core)
                .build()
        // Initialize Fabric with the debug-location_inactive crashlytics.
        Fabric.with(context, crashlyticsKit)

我正在用throw NullPointerException()Crashlytics.getInstance().crash()测试它。他们都没有打电话给听众。当应用程序再次启动时,它位于日志中:

I/CrashlyticsCore: Initializing Crashlytics 2.6.1.23
I/CrashlyticsInitProvider: CrashlyticsInitProvider initialization successful
D/FirebaseApp: com.google.firebase.crash.FirebaseCrash is not linked. Skipping initialization.
I/CrashlyticsCore: Crashlytics report upload complete: SOME-LETTERS-AND-NUMBERS

我究竟做错了什么?

编辑我使用How to show a Dialog after crash by using Crashlytics?的代码作为我的模板,但似乎API略有变化(在这个答案中,它实例化为一个类,但现在它是一个监听器,请参阅docs

android firebase crashlytics google-fabric
2个回答
4
投票

默认情况下,Firebase Crashlytics正在使用内容提供程序hack自动初始化自身(com.crashlytics.android.CrashlyticsInitProvider注入合并的AndroidManifest)。

根据documentation自动初始化可以用meta-data标志覆盖:

<manifest>
    <application>

        <meta-data
            android:name="firebase_crashlytics_collection_enabled"
            android:value="false" />

    </application>
</manifest>

现在调用Fabric.with(context, crashlyticsKit)实际上会初始化sdk并且应该正确触发侦听器。


1
投票

根据https://docs.fabric.io/javadocs/crashlytics/2.6.8/deprecated-list.html文档,我们必须使用CrashlyticsCore.Builder()。listener。

在项目gradle文件中放置依赖项。

buildscript {
    ext.kotlin_version = '1.3.21'
    repositories {
        google()
        jcenter()
        //TODO for fabric crash
        maven {
            url 'https://maven.fabric.io/public'
        }

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0-alpha07'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        //TODO for fabric crash
        classpath 'com.google.gms:google-services:4.2.0'
        classpath 'io.fabric.tools:gradle:1.26.1'
        //TODO end
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()


    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

在app.gradle文件中放在gradle下依赖:

    //TODO fabric crash 
    implementation 'com.google.firebase:firebase-core:16.0.7'
    implementation 'com.crashlytics.sdk.android:crashlytics:2.9.9'
    //TODO end

在清单文件中,将此元数据标记放在应用程序标记下。

在MainActivity.Kt

package com.darshan.crahdemo

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.crashlytics.android.Crashlytics
import com.crashlytics.android.core.CrashlyticsCore
import io.fabric.sdk.android.Fabric
import kotlinx.android.synthetic.main.activity_main.tvCrash

class MainActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val core = CrashlyticsCore
      .Builder()
      .listener {
        Log.d("****************", "Crash happened")
      }
      .build()

    val crashlyticsKit = Crashlytics
      .Builder()
      .core(core)
      .build()

    Fabric.with(this, crashlyticsKit)

    tvCrash.text = "Crash!"
    tvCrash.setOnClickListener {
      Crashlytics.getInstance().crash() // Force a crash
    }

  }
}

我有测试代码是完美的工作。我附上了日志的截图。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.