Android App 常见异常
CRASH
在应用程序代码中出现了未捕获异常,导致程序异常退出,具体表现为闪退或App停止运行。
发生crash的原因:
一般是因为业务代码导致了异常,比如空指针、索引越界、内存溢出等。
ANR(Application Not Responding)
应用程序无响应,用户的输入操作在5s之内没有得到相应,此时Android系统就会判定出现了ANR,会显示一个ANR对话框,用户可以选择继续等待或者关闭应用程序。
发生ANR的原因:
Android的机制是通过主线程(UI线程)创建UI、更新UI状态及处理用户的事件操作。如果在主线程中做了其他的一些耗时操作,比如:数据库读取、文件读取、网络操作等就会主线程阻塞,导致无法及时相应用户的操作。
logcat日志
logcat是Android中用来查看日志的命令行工具,Android会在运行的时候将系统及应用程序的日志保存到 logcat 中。
adb logcat 命令格式:
adb logcat <参数> ... <过滤器> ...
logcat日志由以下部分组成:
-
写下日志时的日期时间
-
PID(进程ID)
-
TID(线程ID)
-
优先级,在Android中,日志的优先级从低到高分以下几种:
V —Verbose (啰嗦,最低级别,开发调试中的一些详细信息,仅在开发中使用,不可在 发布产品中输出)
D —Devug (调试,用于调试的信息,可以在发布产品中关闭,比较常见)
I —Info (信息,一般提示性的消息)
W —Warning (警告)
E —Error (错误,已经出现可影响运行的错误,比如应用crash时输出的日志)
F —Fatal (严重的错误,已经出现可影响运行的错误,比如应用crash时输出的日志)
S —Slient
5. 标签(tag),日志发起者
6. 正文,日志的主体内容
logcat 缓冲区
logcat 日志是保存在缓冲区中的,缓冲区可以通过logcat命令来查看和使用。
因为Android logcat日志是实时不断打印的,所以需要用到环形缓冲区。在通常情况下,写满时最旧的日志会被删除以给新输出的日志留内存空间。
在开发者选项,有个选项就做“日志记录器缓冲区大小”,默认是256K。
Android log 输出量非常多,因此Android会把不同类型的log输出到不同的缓冲区中:
1. Radio:通讯系统的log,比如:蓝牙、WiFi、3G/4G等
2. System:系统组件的log,比如:系统服务
3. Event:事件的log,不如:触摸事件、按键事件
4. Main:Java层的log,测试App需要重点关注的模块
如:想输出通信系统的log:
adb logcat -b radio
默认log输出(不指定缓冲区的情况下)是输出Main和System缓冲区的log。
logcat 参数
参数
|
描述
|
-b
|
指定查看的日志缓冲区,比如event和radio。默认值是main
|
-c
|
清除缓冲区中的全部日志并退出(清除完后可以使用-g查看缓冲区)
|
-g
|
打印日志缓冲区的大小并退出
|
-d
|
将缓冲区的log输出带终端然后退出
|
-s
|
设置过滤器
|
logcat 过滤器
为了减少不想要日志的输出,可以建立一个过滤器
过滤语法:
比如:
# 仅输出tag为“ActivityManager”且优先级大于等于“info”
adb logcat -s ActivityManager:I
# 显示所有优先级大于等于“warning”的日志
adb logcat -s *:W
traces 日志
Android系统每次发生ANR后,都会在 /data/anr/ 目录下面输出一个traces.txt 文件,这个文件记录了发生问题进程的虚拟机相关信息和线程的堆栈信息,通过这个文件我们就能分析出当前线程正在做什么操作,继而可以分析出ANR的原因。
获取traces.txt 文件
adb pull /data/anr/traces.txt <本地电脑路径>
需要注意:在Android 10 以下的系统会使用上述命苦可以导出traces文件,但是在Android 10及以上版本traces文件做了优化,会根据时间戳来分别生成单独的traces文件(可以避免traces文件覆盖问题),而且通过 adb pull 导出 traces文件时会提示 Permission denied
解决方案:获取 bugreport 日志
bugreport 日志
bugreport文件中记录了系统运行过程中的各种log信息,bugreport中包含了设备日志、堆栈轨迹和其他诊断信息,可以帮助开发人员查找和修复应用中的错误。
获取bugreport 日志
第一种:
1. 在开发者选项中,选择生成 bug report
2. 选择bug report 类型,过一会就会在通知栏收到一个报告准备好的通知
第二种:
bugreport 日志分析
bugreport 往往会包含大量的文件内容,可以利用工具 ChkBugReport 。
使用步骤:
-
下载ChkBugReport jar 包
-
解压bugreport-XXX.zip压缩包,得到 bugreport-XXX.txt文件,使用命令
java -jar chkbugreport-0.5-215.jar "bugreport-XXX.txt"
IOS端日志分析
ios设备上的应用崩溃之后,操作系统会生成一个崩溃报告,也叫崩溃日志,保存在设备上。
常见的日志获取方式有以下几种:
-
本机系统设置→隐私→分析与改进里找到当时的崩溃日志
-
使用第三方软件,比如 iTools、爱思助手等,可以导出 Crash 日志
-
使用Xcode,选择顶部菜单栏Windows,选中 Devices and Simulators 打开
移动端日志系统
日志系统,是移动端定位排查线上问题非常有效的一个工具,它还可以帮助我们统计用户行为、发现代码运行问题等。
第三方商业日志系统
1. 腾讯Bugly:https://bugly.qq.com
2. 友盟:https://developer.umeng.com/docs/119267/detail/119477
3. 听云:https://www.tingyun.com/
开源日志框架
1. 美团的Logan:https://github.com/Meituan-Dianping/Logan
2. 微信的xLog:https://github.com/Tencent/mars