Android ANR 问题详解 (2)

Android ANR 问题详解

pull traces 文件到桌面

5. ANR 问题分析解决建议

分析查看ANR原因,接着解决ANR问题。

耗时操作
请放在工作现场中进行,可以使用Handler、AsyncTask 等。

IO 操作
(比如:网络操作、存储操作等)也是引起ANR的常见因素。强烈建议在工作线程中进行。

程序锁竞争

某些情况,ANR产生的原因不是直接因为在主线程中产生的。 比如: 工作线程对某个资源等上锁,恰好此时,主线程需要此资源,如等待超时,则此时ANR可能发生。

死锁

当主线程因为请求一个其他线程正在持有的资源而进入等待状态时,ANR可能会发生。

广播接收慢

应用程序可以通过广播接收器响应广播消息,例如启用或禁用飞行模式或更改连接状态。 当应用程序花费太长时间来处理广播消息时,理论上超过10s 未处理完成,ANR可能会发生。

广播 ANR发生在下列情况下:

onReceive() 方法长时间未执行完毕。

尽量避免在onReceive() 中进行耗时操作。

广播接收者调用goAsync()方法并且未能在PendingResult对象上调用finish()。

如要处理的广播内容较多,请使用IntentService 进行处理。

比如下面例子:

不建议在onReceive 方法中进行耗时操作,超过10s 未处理,会引起ANR

Android ANR 问题详解

不建议在onReceive 方法中进行耗时操作,超过10s 未处理,会引起ANR

建议使用IntentService ,避免ANR发生

Android ANR 问题详解

IntentService 避免处理广播消息过多引起ANR

您的广播接收机可以使用goAsync()来通知系统需要更多的时间来处理消息。 但是,您应该在PendingResult对象上调用finish()。 以下示例显示如何调用finish()以让系统回收广播接收器并避免ANR:

Android ANR 问题详解

goAsync()---finish 获取更多广播响应时间

6. MTK 平台 ANR问题分析

前提,抓取一份ANR的 MTK log。

1.event_log 中 搜索关键字 am_anr或者anr,分析并查看ANR原因

Android ANR 问题详解

event_log 分析 ANR原因

2. main_log中 搜索关键字Application Not Responding或者anr ,分析并查看ANR原因。

Android ANR 问题详解

main_log 中分析ANR 原因

3. MTK ANR 策略建议

Android ANR 问题详解

MTK 官方总结图

Android ANR 问题详解

MTK ANR 分析步骤

Android ANR 问题详解

MTK ANR Debug SOP

Android ANR 问题详解

MTK ANR Debug SOP

常见ANR 举例分析如下:

Android ANR 问题详解

Main Thread is idle

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzddxg.html