因为APP上线后无法预知各种异常问题,也不能联调查看,需要将崩溃日志上报
代码实现
1.创建一个名为CrashHandler的类,实现UncaughtExceptionHandler接口来捕获崩溃日志:
import android.content.Context
import android.os.Build
import android.text.format.DateFormat
import android.util.Log
import java.io.File
import java.io.FileWriter
import java.io.IOException
import java.io.PrintWriter
import java.io.StringWriter
import java.io.Writer
import java.util.*
class CrashHandler(private val mContext: Context) : Thread.UncaughtExceptionHandler {
private val mDefaultHandler: Thread.UncaughtExceptionHandler?
init {
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler()
}
override fun uncaughtException(thread: Thread, ex: Throwable) {
val crashInfo = StringBuilder()
crashInfo.append("Crash time: ").append(DateFormat.format("yyyy-MM-dd HH:mm:ss", Date()).toString()).append('\n')
crashInfo.append("Device manufacturer: ").append(Build.MANUFACTURER).append('\n')
crashInfo.append("Device model: ").append(Build.MODEL).append('\n')
crashInfo.append("Android version: ").append(Build.VERSION.RELEASE).append('\n')
crashInfo.append('\n')
crashInfo.append(getStackTraceString(ex))
saveCrashLogToFile(crashInfo.toString())
sendCrashLogToRemoteServer(crashInfo.toString())
mDefaultHandler?.uncaughtException(thread, ex)
}
private fun getStackTraceString(ex: Throwable): String {
val result = StringWriter()
val printWriter = PrintWriter(result)
ex.printStackTrace(printWriter)
return result.toString()
}
private fun saveCrashLogToFile(crashInfo: String) {
val logFile = File(mContext.getExternalFilesDir(null), "crash_log.txt")
try {
val writer = FileWriter(logFile, true)
writer.write(crashInfo)
writer.flush()
writer.close()
} catch (e: IOException) {
e.printStackTrace()
}
}
private fun sendCrashLogToRemoteServer(crashInfo: String) {
// 在这里实现将崩溃日志发送到远程服务器的逻辑
Log.d("CrashHandler", "Sending crash log to remote server: $crashInfo")
}
}
2. 创建一个名为MyApplication的类,将CrashHandler绑定到应用中:
import android.app.Application
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
Thread.setDefaultUncaughtExceptionHandler(CrashHandler(this))
}
}