自定义崩溃日志捕获系统

因为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))
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值