[Android]ANR

报错信息:查看LOG发现是ANR错误,提示原因为keyDispatchingTimedOut

原因分析:

1.长时间的I/O处理,比如读写大文件的时候或者网络访问时造成的阻塞,会引发这个问题。
2.执行耗时的运算,安卓系统一般默认为超过5000ms就会5秒开始弹出ANR窗口,某些应用可能首次执行时没有缓存十分耗时,我们一般可以通过Splash播放闪屏Logo等方式来延缓加载。
3.Service和appWidget中也要注意多线程的使用,除非它和Activity工作在不同的进程。

解决方法:
下面提供几个避免ANR问题的方法
1.耗时的操作尽量分段处理,使用类似状态机的方法,类似Symbian的活动对象将一个复杂的事情,分段执行。
2.单独开工作者线程,通过独立的Thread或使用类似AsyncTask的方式来处理耗时的内容。
3.UI线程中不要处理过多的内容,比如将一个比较大的文件(比如5MB)的文本,让TextView去setText,像这种UI操作,一般是没有什么好方法来解决,所以遇到UI中需要执行复杂的操作的时候,我们可以参考上面第2条中提到的分段处理方式。

补充说明:
当发生ANR错误时,具体代码出错记录会保存在data/anr/traces.txt里,我们可以从这里查看错误记录

[转自:http://wlkc.gtxy.cn/android/List.asp?ID=20]

### 分析和解决 Android 应用中的 ANR(Application Not Responding)问题 Android 中的 ANR(Application Not Responding)是指应用程序在一定时间内没有响应用户的输入事件或未能及时完成特定组件的操作,系统会判定为应用无响应,并弹出 ANR 对话框。分析和解决 ANR 问题对于提升应用的稳定性与用户体验至关重要。 #### ANR 的类型与触发机制 ANR 主要有以下几种类型,每种类型的触发时间阈值不同: - **Input Event Timeout(输入事件超时)**:主线程在 5 秒内未响应输入事件,例如点击、滑动等。 - **Broadcast Timeout(广播超时)**:前台广播在 15 秒内未完成,后台广播在 60 秒内未完成。 - **Service Timeout(服务超时)**:前台服务在 20 秒内未完成,后台服务在 200 秒内未完成。 - **ContentProvider Timeout(内容提供者超时)**:在 10 秒内未发布内容提供者。 这些机制确保了系统资源的合理调度和用户体验的流畅性。 #### ANR 日志的获取方法 为了分析 ANR 问题,首先需要获取相关的日志信息: - **实时日志捕获**:使用 `adb logcat -v time | grep "ANR in\|am_anr"` 过滤 ANR 关键词。 - **导出 traces 文件**:通过 `adb pull /data/anr/traces.txt` 获取线程堆栈信息(每次新的 ANR 会覆盖旧文件)。 - **完整系统报告**:使用 `adb bugreport` 获取包含 CPU、内存、I/O 等系统数据的完整报告。 这些日志提供了关于 ANR 发生时的应用状态、线程状态和系统资源使用情况。 #### ANR 的核心分析流程 分析 ANR 日志的流程主要包括以下几个步骤: 1. **确认 ANR 类型**:根据日志中的关键词确定 ANR 的具体类型。 2. **分析 trace 文件**:查看线程堆栈信息,识别主线程是否被阻塞、是否存在锁竞争或 Binder 线程耗尽等问题。 3. **定位根因**:通过分析 trace 文件中的调用栈和线程状态,确定 ANR 的根本原因。 #### ANR 治理方案 治理 ANR 问题需要从多个方面入手: - **透彻理解机制**:掌握 Input、Service、Broadcast 和 Binder 等超时机制,以及系统调度原理。 - **强大的监控体系**:线上平台需要抓取 ANR 事件、主线程堆栈和系统 Traces 文件;线下使用 Systrace、Perfetto、Profiler 和 `adb bugreport` 工具进行分析。 - **精准根因分析**:区分主线程阻塞、Binder 线程耗尽、系统资源瓶颈等问题,利用 Traces 文件分析锁和线程状态是关键突破口。 - **针对性优化**: - **主线程优化**:避免在主线程上执行耗时操作,优化布局和视图层次。 - **Binder 调用优化**:异步化 Binder 调用,优化服务端性能。 - **系统资源优化**:关注 CPU、内存和 I/O 使用情况,避免资源瓶颈。 - **现代化架构**:采用 WorkManager、协程/RxJava、响应式架构和生命周期感知组件,提高应用的响应能力。 - **闭环流程与文化**:设定目标、监控告警、深度分析、有效修复、严格验证、灰度发布、持续复盘和知识沉淀。将稳定性(特别是 ANR 率)作为核心质量指标。 #### 使用工具分析 ANR 问题 - **Android Profiler**:通过 Android Studio 的 Profiler 工具可以实时监控 CPU、内存和网络使用情况,帮助识别 ANR 的潜在原因。 - **StrictMode**:在开发阶段启用 StrictMode 可以检测主线程上的违规操作,如网络请求或数据库操作,从而提前发现可能导致 ANR 的问题。 #### 示例代码:使用 StrictMode 检测主线程违规操作 ```java public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .penaltyLog() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .penaltyLog() .build()); } } ``` 通过上述代码,可以在开发阶段检测主线程上的磁盘读取操作,并记录日志以便优化。 --- #### 相关问题 1. 如何通过 Systrace 工具分析 ANR 问题? 2. Android 中如何优化主线程的性能以避免 ANR? 3. 如何在生产环境中监控和捕获 ANR 事件? 4. Android 中如何处理 Binder 线程耗尽导致的 ANR 问题? 5. 如何通过响应式架构减少 ANR 的发生?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值