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
不建议在onReceive 方法中进行耗时操作,超过10s 未处理,会引起ANR
建议使用IntentService ,避免ANR发生
IntentService 避免处理广播消息过多引起ANR
您的广播接收机可以使用goAsync()来通知系统需要更多的时间来处理消息。 但是,您应该在PendingResult对象上调用finish()。 以下示例显示如何调用finish()以让系统回收广播接收器并避免ANR:
goAsync()---finish 获取更多广播响应时间
6. MTK 平台 ANR问题分析前提,抓取一份ANR的 MTK log。
1.event_log 中 搜索关键字 am_anr或者anr,分析并查看ANR原因event_log 分析 ANR原因
2. main_log中 搜索关键字Application Not Responding或者anr ,分析并查看ANR原因。main_log 中分析ANR 原因
3. MTK ANR 策略建议MTK 官方总结图
MTK ANR 分析步骤
MTK ANR Debug SOP
MTK ANR Debug SOP
常见ANR 举例分析如下:
Main Thread is idle