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 来获得日志,这个能获取好几个月内的崩溃日志
-
手机开启 开发者选项
-
获得日志文件
执行 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 -
搜索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);
}
}