Android性能优化-------ANR

为什么会发生ANR

  • 当您的 Activity 位于前台时,您的应用在 5 秒钟内未响应输入事件或 BroadcastReceiver(如按键或屏幕轻触事件)。
  • 虽然前台没有 Activity,但您的 BroadcastReceiver 用了相当长的时间仍未执行完毕。

 常见的ANR类型

  1. 应用在主线程上非常缓慢地执行涉及 I/O 的操作。
  2. 应用在主线程上进行长时间的计算。
  3. 主线程在对另一个进程进行同步 binder 调用,而后者需要很长时间才能返回。
  4. 主线程处于阻塞状态,为发生在另一个线程上的长操作等待同步的块。
  5. 主线程在进程中或通过 binder 调用与另一个线程之间发生死锁。主线程不只是在等待长操作执行完毕,而且处于死锁状态。如需更多信息,请参阅维基百科上的死锁

可以总结为主线程由于各种原因无法继续执行的导致的问题。

如何去定位发现anr问题呢?

1、StrictMode

https://blog.csdn.net/weixin_40763897/article/details/89018306

2、拉取跟踪信息文件

adb bugreport > bugreport.txt

提取出来的压缩文件,我们解压缩会出现下面的文件

 我们打开bugreport-xxxxxx文件

 在其中搜索am_anr

我们可以看到出错的程序

com.yuanxuzhen.testandroid

pid 21165

time:08-19 17:24:50.271

我们打开Fs/data/anr下的文件

anr_2021-08-19-17-24-50-325 我们这里可以看到对应的时间戳和上面是一样的 

我们打开看下

suspend all histogram:	Sum: 337us 99% C.I. 2us-199us Avg: 37.444us Max: 199us
DALVIK THREADS (16):
"main" prio=5 tid=1 Runnable
  | group="main" sCount=0 dsCount=0 flags=0 obj=0x71cc0d38 self=0xeca71e00
  | sysTid=21165 nice=-10 cgrp=default sched=0/0 handle=0xece97dc0
  | state=R schedstat=( 9490609584 48237468 399 ) utm=944 stm=4 core=6 HZ=100
  | stack=0xff3b0000-0xff3b2000 stackSize=8192KB
  | held mutexes= "mutator lock"(shared held)
  at com.yuanxuzhen.testandroid.performOpti.PerformAnrActivity$1.onClick(PerformAnrActivity.java:23)
  at android.view.View.performClick(View.java:7188)
  at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:967)
  at android.view.View.performClickInternal(View.java:7165)
  at android.view.View.access$3500(View.java:814)
  at android.view.View$PerformClick.run(View.java:27657)
  at android.os.Handler.handleCallback(Handler.java:883)
  at android.os.Handler.dispatchMessage(Handler.java:100)
  at android.os.Looper.loop(Looper.java:230)
  at android.app.ActivityThread.main(ActivityThread.java:8010)
  at java.lang.reflect.Method.invoke(Native method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:526)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1034)

我们可以看到tid和上面对上了,说明当时主线程在做堆栈中的事情。

com.yuanxuzhen.testandroid.performOpti.PerformAnrActivity$1.onClick(PerformAnrActivity.java:23)

我们就去提示的位置看看逻辑是否有上面我们说的ANR类型。

官方文档地址

https://developer.android.google.cn/topic/performance/vitals/anr?hl=zh-cn#slow_code_on_the_main_thread

https://source.android.google.cn/source/read-bug-reports.html?hl=zh-cn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值