概述
在Android应用的开发过程中,总会遇到应用程序Crash。在编码阶段,设备连接到PC,可以在Android Studio的Logcat中可以查看Crash的信息。但是很明显,靠这种方式收集Crash日志修改bug,实在是太不靠谱,一旦APP发布测试甚至生产环境,如果没有一个Crash日志的反馈,那么将会是一个噩梦,所以本文的目的:
- 实现自定义的UncaughtExceptionHandler,收集Crash的信息和设备的基本信息,并写入设备的SD卡中;
- 接入第三方SDK(Bugly),收集和上报到第三方平台;
- 发布到Google Play的APP,在Google Play Console中查看Crash统计信息。
有了Bugly或者其它第三方平台(如友盟等),可以很方便地管理Crash日志,通过分析日志可以尽快解决bug。而写入设备SD卡中的Crash日志文件则方便在测试阶段查看和分析,必要时也可以发送到自己的后台服务器。
自定义 UncaughtExceptionHandler
捕抓Crash事件
应用程序的Crash事件是可以捕抓的,在自定义的Application中添加一行代码,UncaughtExceptionHandler接口即可:
override fun onCreate() {
super.onCreate()
Thread.setDefaultUncaughtExceptionHandler(CrashExceptionHandler.getInstance(this))
}
实现CrashExceptionHandler
UncaughtExceptionHandler接口只有一个方法uncaughtException(thread: Thread, ex: Throwable),Crash信息就在ex中。除了Crash日志外,为了方便调试,一般还需要收集设备的基本信息(在collectDeviceInfo(context)中处理),然后把收集到的信息写入文件(writeCrashInfoIntoFile(ex)),最后将Crash交给默认的UncaughtExceptionHandler处理,基本就完成了:
class CrashExceptionHandler private constructor(context: Context) : UncaughtExceptionHandler {
override fun uncaughtException(thread: Thread, ex: Throwable) {
collectDeviceInfo(context)
writeCrashInfoIntoFile(ex)
defaultHandler!!.uncaughtException(thread, ex)
}
}
CrashExceptionHandler类的完整代码如下:
import android.content.Context
import android.content.pm.PackageManager
import android.content.pm.PackageManager.NameNotFoundException
import android.os.Build
import android.util.Log
import java.io.*
import java.lang.Thread.UncaughtExceptionHandler
import java.text.SimpleDateFormat
import java.util.*
class CrashExce