ANR定位

本文详细介绍了在Android应用开发中如何避免应用无响应(ANR)的问题,包括避免主线程执行耗时操作和优化BroadcastReceiver处理逻辑的方法。同时,提供了通过命令行获取ANR堆栈日志进行问题定位的具体步骤。

 

      在Android里,应用程序的响应性是由Activity Manager和WindowManager系统服务监视的 。当它监测到以下情况中的一个时,Android就会针对特定的应用程序显示ANR:

         1.在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸)

         2.BroadcastReceiver在10秒内没有执行完毕

      如何去避免ANR呢?

         1.避免在主线程执行耗时操作,比如io操作,数据库操作,图片处理等等

         2.在BroadcastReceiver的onrecive里不要执行耗时操作,否则超过10秒就会导致ANR

     今天在云测上偶现ANR事件, 如何去定位呢?

     可以通过命令adb pull /data/anr/traces.txt . 获取ANR堆栈日志,然后查找日志里

以DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0)


"main" prio=5 tid=1 NATIVE开头的日志,看下出错信息,就可以分析到ANR的原因了

     

Android开发中,ANR(Application Not Responding)异常是一个常见的性能问题,通常发生在主线程执行了耗时操作,导致系统无法及时响应用户的输入事件。要定位和解决ANR异常,可以按照以下方法进行: ### 1. 获取ANR日志 当发生ANR时,系统会在`/data/anr/`目录下生成一个名为`traces.txt`的日志文件。可以通过以下命令将日志文件拉取到本地: ```bash adb pull /data/anr/traces.txt ``` 通过分析这个日志文件,可以获取到主线程的状态以及调用堆栈信息,从而找到导致ANR的原因。 ### 2. 分析主线程状态 在`traces.txt`日志中,重点关注主线程的堆栈信息。如果主线程处于`nativePollOnce`状态,则说明主线程可能正在等待某个事件完成,而没有及时处理用户输入。例如: ``` at android.os.MessageQueue.nativePollOnce(Native method) at android.os.MessageQueue.next(MessageQueue.java:323) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5417) ``` 这种情况通常是由于主线程执行了耗时操作(如网络请求、数据库查询等)或被其他任务阻塞导致的。 ### 3. 检查主线程中的耗时操作 确保所有耗时操作不在主线程中执行。例如,网络请求应使用异步方式处理: ```java new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... voids) { // 执行耗时操作 return performNetworkRequest(); } @Override protected void onPostExecute(String result) { // 更新UI } }.execute(); ``` ### 4. 使用工具检测卡顿 - **Systrace**:通过Systrace工具可以可视化地查看主线程的执行情况,识别是否存在长时间运行的任务。 - **Traceview**:用于分析代码执行时间,帮助找出性能瓶颈。 ### 5. 避免主线程阻塞 确保不要在主线程中执行同步的I/O操作或复杂的计算任务。可以使用线程池或异步任务来处理这些操作: ```java ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(new Runnable() { @Override public void run() { // 执行耗时操作 } }); ``` ### 6. 监控与优化 定期监控应用的性能表现,特别是在关键路径上(如启动页、首页等)。使用性能监控工具(如Firebase Performance Monitoring)可以帮助发现潜在的ANR风险。 ### 7. 日志分析与调试 结合Logcat输出的日志信息,进一步确认是否在主线程中有不当的操作。例如,检查是否有大量的GC(垃圾回收)操作或内存泄漏问题。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值