android崩溃处理

android崩溃处理

使用logcat获得日志

如果能获得logcat,可以直接查看logcat日志,logcat日志缓冲区是有限制的,超过则会清除旧的日志,所以一般只能保存10几分钟
可以用如下命令把崩溃日志保存到文件中
adb shell dumpsys dropbox --print > log-crash.txt

这个只能查看实时日志,没法查看历史日志,可用如下命令快速过滤崩溃日志
adb logcat -s AndroidRuntime

使用dropbox获得日志

如果没有在崩溃时第一时间通过logcat获得日志,可以尝试用dropbox获得日志,大概能获取7天内的崩溃日志
adb shell dumpsys dropbox --print >crash.log
如果是unity崩溃,可以搜索 UnityMain >>>

使用bugreport获得日志

如果没有在崩溃时第一时间通过logcat获得日志,那可以尝试用 bugreport 来获得日志,这个能获取好几个月内的崩溃日志

  1. 手机开启 开发者选项

  2. 获得日志文件
    执行 adb bugreport {outputDir}
    {outputDir} 是报告输出的目录,会生成一个压缩文件到目录下,如果目录不存在,则生成 目录名.zip 的压缩文件
    解压报告,最重要的是 bugreport-BUILD_ID-DATE.txt 这个文件,里面记录了系统服务 (dumpsys)、错误日志 (dumpstate) 和系统消息日志 (logcat) 的诊断输出
    参考 https://source.android.google.cn/source/read-bug-reports.html?hl=zh-cn
    下面是一些日志关键字

        system log:
        ------ SYSTEM LOG (logcat -v threadtime -v printable -v uid -d *:v) ------
        --------- beginning of crash
        --------- beginning of system
        --------- beginning of main
        ------ was the duration of 'SYSTEM LOG' ------
    
        event log:
        ------ EVENT LOG (logcat -b events -v threadtime -v printable -v uid -d *:v) ------
        ------ was the duration of 'EVENT LOG' ------
    
        stat log:
        ------ STATS LOG (logcat -b stats -v threadtime -v printable -v uid -d *:v) ------
        ------ was the duration of 'STATS LOG' ------
    
        radio log:
        ------ RADIO LOG (logcat -b radio -v threadtime -v printable -v uid -d *:v) ------
        ------ was the duration of 'RADIO LOG' ------
    
        last log:
        ------ LAST LOGCAT (logcat -L -b all -v threadtime -v printable -v uid -d *:v) ------
    
        crach stack:
        ------ VM TRACES AT LAST ANR (/data/anr/traces.txt: 2015-10-01 18:14:41) ------
        "main" prio=5 tid=1 Suspended
        Stacks for other threads in this process follow
    

    可以使用第3方工具来分析 bugreport-BUILD_ID-DATE.txt
    参考 https://github.com/sonyxperiadev/ChkBugReport/wiki/Where-to-obtain-it
    下载 chkbugreport.jar 后,执行
    java -jar path/to/chkbugreport.jar bugreport.txt

  3. 搜索unity崩溃日志
    可能位于这些文件中,按优先级排序为 bugreport-BUILD_ID-DATE.txt > proto/incident_report.proto > FS/data/tombstones/.
    可用 UnityMain >>> 进行搜索,比如 先在 bugreport.txt 中搜索,没有则到 incident_report.proto 搜索,最后到 tombstones 目录下搜索
    或者直接使用搜索文件,全局搜索 UnityMain >>>

用代码捕获android崩溃日志

主要是使用 Thread.setDefaultUncaughtExceptionHandler 来捕获所有线程的异常
注意 Thread.currentThread().setUncaughtExceptionHandler(this) 只对注册的线程起作用
在处理的过程要先调用 SystemClock.sleep(requetTimeOut); 延迟一段时间再关闭进程

    public class exceptioncatch implements Thread.UncaughtExceptionHandler 
    {
 
        private Thread.UncaughtExceptionHandler defaultThread;
        private final String ErrorUploadUrl = "http://xxxxxxxxxxxxxx.php?";
        private String account = "Login";
        private int requetTimeOut = 5000;
    
        public void Init()
        {
            Thread.setDefaultUncaughtExceptionHandler(this);//所有线程上都起作用
            //Thread.currentThread().setUncaughtExceptionHandler(this);//只对应注册的线程起作用
            defaultThread = Thread.getDefaultUncaughtExceptionHandler();
            Log.e("ZP", "启动异常捕获");
        }
    
        @Override
        public void uncaughtException(Thread t, Throwable ex)
        {
            Log.e("ZP", "捕捉到了异常");
    
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            ex.printStackTrace(pw);
            pw.close();
            SystemClock.sleep(requetTimeOut);
            defaultThread.uncaughtException(t, ex);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值