旧机宝开发笔记之:崩溃日志采集

安卓app运行过程中会产生一些异常(Exception),当这些异常能够被捕获的时候,程序本身就可以通过try/catch来处理异常,但是当这些异常不能被捕获(UncaughtException)的时候,就交给系统的默认的未捕获异常处理程序来处理,而默认的处理方式就是退出应用并打印出异常信息。对应用崩溃信息的采集,就是要在系统接手处理UncaughtException之前,先将报错信息写文件或发后台,再交给系统处理(退出应用),故:
1、保存系统UncaughtException处理对象Handler
2、自己写一个UncaughtExceptionHandler,把它设置给系统,等到出现异常的时候先自己处理,再用1中保存的默认UncaughtException处理对象Handler来收尾(退出应用)

val defaultHandler: Thread.UncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler()
        Thread.setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler { thread, throwable ->
            if (throwable == null) {
                defaultHandler.uncaughtException(thread, throwable)
                return@UncaughtExceptionHandler
            }
            val writer: Writer = StringWriter()
            val printWriter = PrintWriter(writer)
            throwable.printStackTrace(printWriter)
            var cause = throwable.cause
            while (cause != null) {
                cause.printStackTrace(printWriter)
                cause = cause.cause
            }
            printWriter.flush()
            printWriter.close()
            val result = writer.toString()
            val addCrashBuilder = AddCrash.newBuilder()
            addCrashBuilder.message = result
            addCrashBuilder.androidVersion = Build.VERSION.RELEASE
            addCrashBuilder.phoneModel = Build.MODEL
            addCrashBuilder.romBrand = Build.BRAND
            addCrashBuilder.romVersion = Build.DISPLAY
            val addCrash=addCrashBuilder.build()
            HttpManager.getInstance().doPost(addCrash.javaClass.simpleName,addCrash.toByteArray(),null)

            Thread(Runnable {
                Looper.prepare()
                Toast.makeText(
                    context, "正在上传崩溃日志...", Toast.LENGTH_LONG
                ).show()
                Looper.loop()
            }).start()
            try {
                Thread.sleep(2000)
            } catch (e: InterruptedException) {
                e.printStackTrace()
            }
            defaultHandler.uncaughtException(thread, throwable)
        })

这样应用在崩溃之前会把日志发送到后台,方便程序员定位解决问题。当然这里也可以通过写文件的处理方式先保存这些报错信息,待日后方便再行上传采集。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值