关于ANR
anr类型
-
主线程对输入事件在5秒内没有处理完毕
Window、 InputDispatcher、 InputChannel,会显示提示
-
主线程在执行BroadcastReceiver的onReceive函数时10秒内没有执行完毕
BroadcastReceiver(简称BR)的onReceive函数运行在主线程中,当这个函数超过10秒钟没有返回就会触发ANR,只有log输出
-
主线程在执行Service的各个生命周期函数时20秒内没有执行完毕
Service的各个生命周期函数也运行在主线程中,当这些函数超过20秒钟没有返回就会触发ANR,只有log输出
处理方法
定位到 logcat.log 文件中 “not responding” 发生时间点,去查看发生 ANR 时间点对应的 trace 文件,该文件路径为/data/anr/traces.txt
如何避免
-
合理使用 UI 主线程,耗时操作放入其他线程工作;
-
合理使用 Handler 来处理其他线程请求;
-
合理使用并遵循 Android 生命周期, 避免在 onCreate() 和 onResume() 做过多的事情;
-
使用一些架构形成规范来避免内存等问题,例如:MVP、RxJava;
-
经常使用工具来检查内存问题,例如:MAT、TraceView、AS 自带等工具;
-
避免加载大图片引起内存不足导致 ANR;
-
避免内存泄露引起的 ANR。
程序异常
Java层代码
异常类型
-
System.err
-
AndroidRuntime
分析定位方法
-
log、logcat|grep过滤tag
-
搜索应用进程ID
-
Debugger断点调试
Native crash
异常类型
-
初始化错误
-
访问错误
-
数组索引访问越界
-
指针对象访问越界
-
访问空指针对象
-
访问无效指针对象
-
迭代器访问越界
-
内存泄露
-
参数错误
-
堆栈溢出
-
类型转换错误
-
数字除0错误
分析方法
- 符号化错误信息
ndk-stack---adb shell logcat | ndk-stack -sym $PROJECT_PATH/obj/local/armeabi
-
logcat -s DEBUG
-
进程信息:pid表示进程号,tid表示线程号,name表示进程名
-
错误信号:signal 11表示信号的数字,SIGSEGV表示信号的名字,code 1(SEGV_MAPERR)表示出错代码,fault addr 00000000 表示出错的地址
-
寄存器快照:进程收到错误信号时保存下来的寄存器快照,一共有15个寄存器
-
堆栈信息:##00表示栈顶,##01调用#00,以此往下都是嵌套的调用关系,直至到栈顶
-