Android ANR问题总结

一、概述

ANR(Application Not Responding), 如果 Android 应用的界面线程处于阻塞状态的时间过长,会触发“应用无响应”(ANR) 错误。如果应用位于前台,系统会向用户显示一个对话框,如图 1 所示。ANR 对话框会为用户提供强行退出应用的选项。

图 1. 向用户显示的 ANR 对话框

二、ANR分类

Input dispatching timed out:输入时间分发超过5s,包括按键和触屏事件。

Broadcast of Intent:前台广播需要在10s内完成,后台广播需要在60s内完成。

executing service:前台服务需要在20s内完成,后台则需要在200s内完成。

ContentProvider:几乎非常少见,publish执行未在10s内完成。

Context.startForegroundService() did not then call Service.startForeground():应用调用startForegroundService,然后5s内未调用startForeground出现ANR或者Crash,此问题属于应用未适配Android版本sdk。

三、产生ANR的原因分析

1. 诊断 ANR 时需要考虑以下几种常见模式:

1、应用在主线程上非常缓慢地执行涉及 I/O 的操作,如有复杂的layout布局、频繁的I/O操作。

2、应用在主线程上进行长时间的计算,如一些耗时操作。

3、主线程在对另一个进程进行同步 binder 调用,而后者需要很长时间才能返回。

4、主线程处于阻塞状态,为发生在另一个线程上的长操作等待同步的块。

5、主线程在进程中或通过 binder 调用与另一个线程之间发生死锁。主线程不只是在等待长操作执行完毕,而且处于死锁状态。

2. 发生ANR的原因:

1、主线程存在耗时操作:主线程阻塞(Blocked)、挂起(suspend)、死锁、死循环、耗时操作等;

2、cpu资源被抢占:其他进程某一时间点cpu占比高、某一刻系统的cpu占比过高,都会导致这一时间段无法抢到cpu时间片;

3、主线程卡在binder通信的对端:需要通过binderinfo查看对端信息;

4、系统或者应用自身可用内存紧张:系统一直在执行lowmemorykiller操作查杀进程;

5、应用频繁crash:包括应用自身也容易导致前台应用出现anr的现象;

6、应用内存泄露;

7、系统原因导致:如冻结、温度过高、多媒体(音视频、编解码)、包管理、Block I/O、底层服务NE(native crash)、watchdog、内存黑洞、芯片能力等。



3. 分析日志思路

首先在android(system)日志中搜索“ANR in”关键字,通过此关键字主要查看

1、发生ANR的应用进程、pid、类型;

2、cpu负载、内存压力、cpu使用情况等。

以上是中国农业银行应用的主线程trace日志,主线程在执行native方法,调用到nSyncAndDrawFrame说明进行GPU渲染的过程中出现耗时操作。

说明:以上分析日志的顺序纯属个人喜好,分析步骤可以因人而异。



4. CPU使用率信息分析

从android(高通平台在android.txt,MTK平台在system*.txt)日志中,查看系

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OPPO内核工匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值