CrashlyticsListener не вызывается - PullRequest
0 голосов
/ 03 марта 2019

Я использую этот код для отслеживания сбоя приложения:

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

Что я делаю не так?

РЕДАКТИРОВАТЬ Я использовал код из Как показатьДиалог после сбоя с использованием Crashlytics? в качестве шаблона для моего, но кажется, что API немного изменился (в этом ответе он создается как класс, но теперь это слушатель, см. docs )

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

В соответствии с документом https://docs.fabric.io/javadocs/crashlytics/2.6.8/deprecated-list.html мы должны использовать CrashlyticsCore.Builder (). Listener.

В файле проекта градала ставить ниже зависимости.

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
}

в приложении.файл 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

0 голосов
/ 13 марта 2019

По умолчанию Firebase Crashlytics использует хак провайдера контента для автоматической инициализации (com.crashlytics.android.CrashlyticsInitProvider внедряется в объединенный AndroidManifest).

Согласно документации автоматическая инициализация может бытьпереопределяется с помощью meta-data flag:

<manifest>
    <application>

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

    </application>
</manifest>

Теперь вызов Fabric.with(context, crashlyticsKit) фактически инициализирует sdk и должен правильно вызывать слушателя.

...