Android ANR
本文链接:https://blog.youkuaiyun.com/feather_wch/article/details/131648541
ANR概念和原因
1、ANR
- 应用程序无响应(非Activity无响应)
- 指的是在特定时间内,无法响应输入事件或者特定事件没有处理完成
2、ANR(Application Not Response)类型 - 点击事件 5s未处理完,且有下一个输入事件
- 广播-前台(10s),后台(60s)
- 服务-前台20s,后台200s
- ContenProvider-10s未处理完
3、ANR避免的操作 - ->主线程进行IO(网络、文件、序列化)
- ->多线程操作的死锁,导致主线程被block
- 主线程被Binder对端Block,Binder(默认同步,可以异步-oneway)
- systemserver中watchDog出现ANR
软件看门口,SystemrServer死亡后无法喂狗,会通知到父进程zygote,zygote会杀死自己。zygote爸爸init发现zygote的死亡信号,会杀死所有zygote的子进程并且重启zygote。整个系统相当于重启一次。
SystemServer的问题一般和kernel没关系,软件看门狗就可以解决
- 系统资源被耗尽(管道、CPU、IO)-app开发者没办法处理,系统开发者
- Service Binder的链接达到上限,无法和SystemServer通信
4、多核(8核)手机的相关知识 - 8核并非完全一致:0-3小核 4-5中核 6-7大核
- 手机厂商发现要运行王者荣耀等游戏时直接绑定到中核+大核上
- 高通等手机厂商提供了cpuset指令,给上层用,去绑定核心
-
- 其他App缺乏系统资源去处理就容易ANR
5、ANR IO实战场景
- 其他App缺乏系统资源去处理就容易ANR
- realm数据库,号称可以在UI线程进行IO,onLayout->systrace(都是微秒级别)通过了测试机和测试部测试,硬件好,软件少,内存不老化。上线后Bugly抛出大量线上ANR
- 主线程sp操作
ANR定位和解决
6、线下场景定位
- logcat : 可以定位到代码位置
- 文件生成在/data/anr/trace_.txt
7、线上场景两大问题:anr和oom - bugly可以集成检测或者自己实现anr监控方案
- 手机品牌、型号、配置+日志信息(确定大概位置)-用目标手机去跑monkey复现
- xxx
8、trace_*.txt文件包含哪些内容? - firstPid:发生anr的PID
- 有发生时间点,CPU使用率等信息
- 有AMS实现该功能,通过 appNotResponding()和dumpStackTrace()来生成应用对应的anr文件
- 通过firstPid可以关注主线程状态 + 其他线程状态
ANR时间 2023年7月7日14:46:21
进程PID 1480
进程名 com.xxx.mobile
ANR类型 KeyDispatchTimeout
9、线程底层的状态 -1~9 11种,Java层面上层 6种状态
- 未定义 -1
- 僵尸 0
- 运行 1
- time wait 2 Object.wait
- xxx
- copy一份吧
10、分析trace文件实战 - 看CPU占用率 -> 1. kernel CPU很高(主线程IO) 2. 整体CPU使用量100%, 系统资源耗尽
- Heap内存情况 -> 排除系统资源耗尽等问题
- 搜索
held by字段,看死锁问题 - 看线程
mainheld mutexes
11、traces_SystemServer_WDT.txt(watchDog) - WatchDog中实现
- 包含system_server进程栈信息
12、traces.txt(dalvik.vm.stack-trace-file) - 系统定义的默认trace文件路径
13、可以以命令方式直接生成trace文件
adb shell kill -3 pid
ANR线上监控
14、ANR线上监控方案一:原生方案FileObserver
- 抽象类,onEvent()回调
- 监控某个目录/文件的状态发生改变(创建,删除目录)-具有八种状态
- 自定义实现FileObserver: 监控 data/anr/ 目录是否发生变化,肯定产生了ANR
- 上传trace文件,可以捞到所有ANR信息(也可能有别人APP的)
15、FileObserver 会不会被 selinux挡住? - 5.0之后肯定会,手机厂商有办法修改 selinux .te配置文件 => 适合灰度发布(全面改版功能,先小范围发布)
16、ANR线上监控方案二:WatchDog方案 - WatchDog集成自线程,是单例,
- 内部有HandlerCheck,把自己加到handler中,一直运行,默认30秒看是否可以执行。
- 可以:代表主线程没有卡住,有一些处理逻辑,会进行dump
createAnrDumpFile()写入到trace文件中 - 可以借鉴WatchDog方案:定时post、并且检查run()是否运行过了
17、WtachDog会有性能损耗,看需求
18、WatchDog源码里面学习假唤醒 - 预防【假唤醒】,采用 wait(timeout) 进行等待
- 可能没到timeout就唤醒了,会计算是否睡满了timeout,没有睡满直接继续wait
- 假唤醒概率极低,但会发生
19、扩展:LeakCanary - leakCanary.watch()
- 5s后会去检测对象有没有释放
最终问题汇总
20、ANR问题如何定位
- 线下和线上
- 线下:logcat日志+trace文件确定anr发生时间点
扩展开胃菜
selinux
1、Linux 安全模型 -> seAndroid 保护系统信息
常问知识点
1、并发synchronized原理、renentrantlock、CAS、AQS(CLH)
2、Java集合框架 HashMap
3、JVM 内存模型 classloader
4、Hadnelr、ASM(startActivity 从整体结构去讲解)
5、性能优化:内存优化(Bitmap)、卡顿优化
6、网络 http版本区别、https认证过程(一定安全吗?)
7、数据结构:链表、二叉树
文章详细介绍了AndroidANR(应用程序无响应)的概念,包括其触发条件、避免策略和不同类型的ANR。ANR主要发生在主线程阻塞、资源耗尽等情况。文章还讨论了如何通过logcat、trace文件和系统监控来定位和解决ANR问题,并提出了线上监控ANR的两种方案:FileObserver和WatchDog机制。同时,文章提到了Selinux在Android安全中的作用,并列举了一些相关技术知识点。
6996

被折叠的 条评论
为什么被折叠?



