稳定性是影响用户体验的重要因素之一,随着APP功能及使用场景的日益复杂,稳定性保障愈发需要贯穿规划、设计、开发、测试、问题解决等应用全生命周期的各个阶段。因此,了解APP稳定性常见问题及定位方法是十分必要的。
应用闪退、崩溃、无响应等稳定性问题严重影响用户使用体验,为此小编梳理总结了常见稳定性问题,将从ANR/冻屏、Crash/Tombstone、资源泄露三方面进行系统介绍,希望为开发者带来帮助。本期将通过常见问题现象、问题定位方法及案例分享三方面对ANR进行介绍。
1、ANR问题原因分析
ANR通常是因为应用主线程被长时间占用,导致无法响应用户的input操作、广播接收和执行服务,此时会生成生成错误日志文件data_app_anr@XXXX, system_app_anr@XXXX。问题形成原因及常见现象详见下表:
2、ANR问题定位方法
1)打开ANR日志信息,确认发生ANR的进程号,ANR类型,问题发生时间等;
2)分析主线程调用栈是否处于耗时、死锁、等锁等状态,判断该ANR是App导致还是系统导致的,一般可结合流水日志确认。如果是死锁,看业务代码即可;
3)如果是Binder阻塞,查看Binder调用链信息,查找对端进程及其对端进程调用stack,找到阻塞函数,如果system_app_anr@ XXXX被截断,可以查看traces.txt文件;
4)如果是nativepollonce,可以查看BlockMonitor日志,是否主线程有比较耗时的操作;CPU占用率情况,iowait情况;最有效的是分析systrace日志;
5)如果system_app_anr@ XXXX中没有发生anr的调用stack,一般是三种情况:
- ANR进程处于D state,导致无法响应SIG 3信号,从而导致无法打印stack,可以通过sysrq信息确认;
- ART处于死锁状态,由于ART本身bug导致无法处理SIG 3操作;
- ANR进程获取不了足够的时间无法打印调用stack。
3、Binder阻塞ANR案例分析
3.1 ANR主栈分析
可以明确,这个ANR发生的原因,是Binder阻塞:
此时主线程,阻塞在isCoverOpen函数。
3.2 Binder阻塞分析
查找对应的Binder transaction信息,分析Binder被阻塞的原因。
(1)确认ANR发生的Binder
阻塞的Binder是aod发生给systemserver的,但看不到systemserver的Binder线程,故需要看看systemserver的Binder情况。
(2)确认对端Binder
分析2618的主栈。
在Binder transcation表中可以看到,systemserver进程的16个Binder线程,全部被阻塞在给hwfacerecognize发送消息。
在Android中一个进程最多会使用16个Binder线程,systemserver的全部Binder线程都被阻塞,故不能再分配Binder线程处理其他的Binder消息,导致其他进程给systemserver发送Binder消息时是会被阻塞,且没有对端Binder线程的。
故问题的焦点,转移到了hwfacerecognize(PID 727)的进程上。
(3)业务代码分析
hwfacerecognize(PID 727)是人脸识别的进程,联合人脸识别模块的分析,发现是727进程出现crash。
为了帮助到大家更好的掌握 Framework 底层与性能优化相关知识点,这准备了 Android11.0最新Framework解析 与 性能优化知识点汇总和Android 性能监控框架 的学习文档,中间记录了 AMS、PMS、WMS、Hander、Binder、启动优化、内存优化、UI优化……等知识点,可谓是很全面了,↓↓↓
有需要的可以复制下方链接,传送直达!!!
https://qr21.cn/CaZQLo?BIZ=ECOMMERCE
内功心法不是一天两天就可以修炼出来的,而是需要每天的坚持,技术提升也是如此。所以最好的速成修炼方法就是每天学习一点,日积月累后就会发现自己进步的效果。
网友评论