📅  最后修改于: 2021-01-02 03:55:30             🧑  作者: Mango
在上一节中,我们了解了Firebase Crashlytics,以及如何使用我们的应用程序进行设置和配置。现在,我们将测试Firebase Crashlytics实现。因此,我们必须为崩溃进行设置,以便了解Crashlytics是否正常运行。
Firebase Crashlytics提供了四种日志记录机制,可让您更深入地了解崩溃报告。这些机制是:
自定义键可帮助我们获取应用程序的特定状态,从而导致崩溃。自定义键将任意键/值对与我们的崩溃报告相关联,并在Firebase控制台中查看它们。有五种设置键的方法,每种方法处理不同的数据类型。
Crashlytics.setString(key, "foo" /* string value */)
Crashlytics.setBool(key, true /* boolean value */)
Crashlytics.setDouble(key, 1.0 /* double value */)
Crashlytics.setFloat(key, 1.0f /* float value */)
Crashlytics.setInt(key, 1 /* int value */)
重置密钥会更新其值:
Crashlytics.setInt("current_level", 3)
Crashlytics.setString("last_UI_action", "logged_in")
我们可以在我们的应用程序中添加自定义Crashlytics日志,以便为导致崩溃的事件提供更多上下文。它将日志与崩溃数据相关联,并使它们在Firebase控制台中可见。我们可以使用Crashlytics.log方法和Log.println()将日志写入崩溃报告:
Crashlytics.log(Log.DEBUG,"tag","message")
//For crash report only
Crashlytics.log("message")
要诊断问题,了解哪些用户经历了给定的崩溃通常会很有帮助。 Crashlytics提供了一种在匿名报告中匿名标识用户的方法。要将用户ID添加到报告中,我们必须为每个用户分配ID号,令牌或哈希值形式的唯一标识符:
Crashlytics.setUserIdentifier("user123456789")
如果我们需要在设置用户标识符后清除它,请将值重置为空白字符串。当我们清除用户标识符时,它不会删除现有的Crashlytics记录。
记录非致命异常意味着我们可以在应用程序的catch块中记录捕获的异常:
try{
methodThatThrows()
}catch(e: Exception){
Crashlytics.logException(e)
//handle our exception here
}
所有记录的异常在Firebase控制台中显示为非严重问题。问题摘要包含我们通常从崩溃中获取的所有状态信息,以及Android版本和硬件设备的故障。
Crashlytics在专用的后台线程中处理异常,并且对应用程序的性能影响很小。
默认情况下,Firebase Crashlytics自动为所有应用程序用户收集崩溃报告。我们可以通过启用对参与发送的数据的更多控制来使用“参与报告”。我们必须禁用自动收集功能,并仅对选择加入的用户初始化Crashlytics。我们可以在AndroidManifest.xml文件中使用元数据标签关闭自动收集:
android:name="firebase_crashlytics_collection_enabled"
android: value="false"/>
我们可以通过初始化应用程序活动之一Fabric.with(this,Crashlytics())的Crashlytics来为选定的用户启用收集功能。
通过Crash Insights,我们可以将您的匿名堆栈跟踪与其他Firebase应用程序的匿名跟踪进行比较,从而解决问题。
Crash Insight Data通过以下两种方式提供帮助:
Crash Insight使用汇总的崩溃数据来识别常见的稳定性趋势。我们可以从Firebase控制台中Crashlytics问题列表顶部的Crash Insight菜单中选择退出Crash Insight。
当任何个人问题在我们的应用中引起紧急问题时,速度警报可以通知我们的团队。当应用程序中的问题超过Firebase控制台中定义的阈值时,将触发速度警报。该阈值是根据受崩溃影响的用户会话的百分比来定义的,并且该值设置在会话的0.1%和1%之间。
如果在特定时间段内满足以下条件,则会触发警报:
要更新速度警报,我们必须具有必要的权限。在Firebase控制台中,转到Crashlytics仪表板:
我们可以使用电子邮件或集成将速度警报发送给我们的团队。让我们看一个示例,在该示例中,我们将创建一个带有按钮的应用程序,该按钮将模拟崩溃。
activity_main.xml
MainActivity.kt
package com.example.crashlyticsexample
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.ViewGroup
import android.widget.Button
import com.crashlytics.android.Crashlytics
import io.fabric.sdk.android.Fabric
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setKeysBasic("JasonTest");
logReportAndPrint()
logReportOnly()
setUserId()
logCaughtEx()
enableDebugMode()
forceACrash()
}
//Setting key-value pairs
private fun setKeysBasic(key: String) {
Crashlytics.setString(key, "foo" /* string value */)
Crashlytics.setBool(key, true /* boolean value */)
Crashlytics.setDouble(key, 1.0 /* double value */)
Crashlytics.setFloat(key, 1.0f /* float value */)
Crashlytics.setInt(key, 1 /* int value */)
}
// Modifying keys
private fun resetKey() {
Crashlytics.setInt("current_level", 3)
Crashlytics.setString("last_UI_action", "logged_in")
}
//Adding custom log and log messages
private fun logReportAndPrint() {
Crashlytics.log(Log.DEBUG, "tag", "message")
}
// Only for log Report
private fun logReportOnly() {
Crashlytics.log("message")
}
// Enabling at run time
private fun enableAtRuntime() {
Fabric.with(this, Crashlytics())
}
// Setting user identifier
private fun setUserId() {
Crashlytics.setUserIdentifier("user123456789")
}
@Throws(Exception::class)
private fun methodThatThrows() {
throw Exception()
}
// log exception
private fun logCaughtEx() {
try {
methodThatThrows()
} catch (e: Exception) {
Crashlytics.logException(e)
// handle your exception here
}
}
// Enabling debug mode
private fun enableDebugMode() {
val fabric = Fabric.Builder(this)
.kits(Crashlytics())
.debuggable(true) // Enables Crashlytics debugger
.build()
Fabric.with(fabric)
}
private fun forceACrash() {
val crashButton = Button(this)
crashButton.text = "Crash!"
crashButton.setOnClickListener {
Crashlytics.getInstance().crash() // Force a crash
}
addContentView(crashButton, ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT))
}
}