android ANR异常定位分析

一. 问题定位

1. 发生anr异常 会在data/anr目录下 存在异常记录

微信图片_20230328095414.png
微信图片_20230328095420.png

使用adb pull data/anr 因为没有权限 会获取失败 更换命令 使用adb bugreport 打包anr信息
成功后 会告知存放位置。解压后文件目录:


1679968766837.png

文件夹中两处 都有相关错误信息
(1)FS/data/anr下 这个更好定位
(2)bugreport-PEXMOO-...文件

定位问题(1)

打开文件大致内容
cmd line 确认是当前应用包名 Cmd line: com.test.test

----- pid 27325 at 2023-03-24 14:36:23 -----
Cmd line: com.test.test
Build fingerprint: 'Xiaomi/renoir/renoir:11/RKQ1.201112.002/V12.5.8.0.RKICNXM:user/release-keys'
ABI: 'arm64'
Build type: optimized
Zygote loaded classes=21457 post zygote classes=1841
Dumping registered class loaders
#0 dalvik.system.PathClassLoader: [], parent #1
#1 java.lang.BootClassLoader: [], no parent
#2 dalvik.system.PathClassLoader: [/system/framework/tcmclient.jar], parent #0
#3 dalvik.system.PathClassLoader: [], parent #0

全局搜 "main" prio=5 确认问题点

"main" prio=5 tid=1 Blocked
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x72c36338 self=0xb400006fa7094c00
  | sysTid=27325 nice=-10 cgrp=top-app sched=0/0 handle=0x702e4cc4f8
  | state=S schedstat=( 168352756660 13839364110 211677 ) utm=14483 stm=2351 core=5 HZ=100
  | stack=0x7fd4b47000-0x7fd4b49000 stackSize=8192KB
  | held mutexes=
  at android.os.MessageQueue.enqueueMessage(MessageQueue.java:557)
  - waiting to lock <0x03180f01> (a android.os.MessageQueue)
  at android.os.Handler.enqueueMessage(Handler.java:778)
  at android.os.Handler.sendMessageAtTime(Handler.java:727)
  at android.view.ViewRootImpl$ViewRootHandler.sendMessageAtTime(ViewRootImpl.java:5135)
  at android.os.Handler.sendMessageDelayed(Handler.java:697)
  at android.os.Handler.postDelayed(Handler.java:499)
  at android.view.HandlerActionQueue.executeActions(HandlerActionQueue.java:85)
  - locked <0x0196e1a6> (a android.view.HandlerActionQueue)
  at android.view.View.dispatchAttachedToWindow(View.java:20667)
  at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3522)
  at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3529)
  at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3529)
  at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3529)
  ... repeated 2 times
  at android.view.ViewGroup.addViewInner(ViewGroup.java:5316)
  at android.view.ViewGroup.addView(ViewGroup.java:5102)
  at android.view.ViewGroup.addView(ViewGroup.java:5039)
  at androidx.recyclerview.widget.RecyclerView$5.addView(RecyclerView.java:889)
  at androidx.recyclerview.widget.ChildHelper.addView(ChildHelper.java:107)
  at androidx.recyclerview.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:8902)
  at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8860)
  at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8848)
  at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1645)
  at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1591)
  at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:668)
  at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4309)
  at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:4012)
  at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4578)
  at android.view.View.layout(View.java:23125)
  at android.view.ViewGroup.layout(ViewGroup.java:6460)
  at androidx.viewpager2.widget.ViewPager2.onLayout(ViewPager2.java:527)
  at android.view.View.layout(View.java:23125)
  at android.view.ViewGroup.layout(ViewGroup.java:6460)
  at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1103)
  at android.view.View.layout(View.java:23125)
  at android.view.ViewGroup.layout(ViewGroup.java:6460)
  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
  at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
  at android.view.View.layout(View.java:23125)
  at android.view.ViewGroup.layout(ViewGroup.java:6460)
  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
  at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
  at android.view.View.layout(View.java:23125)
  at android.view.ViewGroup.layout(ViewGroup.java:6460)
  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
  at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
  at android.view.View.layout(View.java:23125)
  at android.view.ViewGroup.layout(ViewGroup.java:6460)
  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
  at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
  at android.view.View.layout(View.java:23125)
  at android.view.ViewGroup.layout(ViewGroup.java:6460)
  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
  at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
  at com.android.internal.policy.DecorView.onLayout(DecorView.java:797)
  at android.view.View.layout(View.java:23125)
  at android.view.ViewGroup.layout(ViewGroup.java:6460)
  at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3626)
  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3085)
  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2075)
  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8522)
  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1077)
  at android.view.Choreographer.doCallbacks(Choreographer.java:897)
  at android.view.Choreographer.doFrame(Choreographer.java:826)
  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1062)
  at android.os.Handler.handleCallback(Handler.java:938)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  at android.os.Looper.loop(Looper.java:233)
  at android.app.ActivityThread.main(ActivityThread.java:8052)
  at java.lang.reflect.Method.invoke(Native method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)


"main" prio=5 tid=1 Blocked
mian:主线程
prio =5: 线程优先级
Blocked: 当前线程状态 表示当前主线程阻塞 ANR

(线程的状态:
NEW - 创建状态
RUNNABLE - 就绪或运行状态
BLOCKED - 阻塞状态
WATING - 等待状态
TIMED_WAITING - 定时等待状态
TERMINATED - 终止状态)

继续问题定位 当前信息没有自己代码的问题 都是系统代码 但是代码中有两处lock

  • waiting to lock <0x03180f01> (a android.os.MessageQueue)
  • locked <0x0196e1a6> (a android.view.HandlerActionQueue)
    根据地址 搜索调用位置 0x03180f01
"Timer-19" prio=5 tid=123 Runnable
  | group="main" sCount=0 dsCount=0 flags=0 obj=0x14b07060 self=0x6f8a648c00
  | sysTid=6393 nice=0 cgrp=top-app sched=0/0 handle=0x6f25357cc0
  | state=R schedstat=( 70680442813 8390554181 396852 ) utm=6118 stm=949 core=7 HZ=100
  | stack=0x6f25254000-0x6f25256000 stackSize=1043KB
  | held mutexes= "mutator lock"(shared held)
  at android.os.MessageQueue.enqueueMessage(MessageQueue.java:586)
  - locked <0x03180f01> (a android.os.MessageQueue)
  at android.os.Handler.enqueueMessage(Handler.java:778)
  at android.os.Handler.sendMessageAtTime(Handler.java:727)
  at android.view.ViewRootImpl$ViewRootHandler.sendMessageAtTime(ViewRootImpl.java:5135)
  at android.os.Handler.sendMessageDelayed(Handler.java:697)
  at android.os.Handler.post(Handler.java:427)
  at android.view.View.post(View.java:18950)
  at com.xxx.xxxx.webView.BaseWebViewClient$TT.run(BaseWebViewClient.kt:23)
  at java.util.TimerThread.mainLoop(Timer.java:562)
  at java.util.TimerThread.run(Timer.java:512)

然后发现在自己代码中的问题点
at com.xxx.xxxx.webView.BaseWebViewClient$TT.run(BaseWebViewClient.kt:23)

定位问题(2)

打开文件大概信息

========================================================
== dumpstate: 2023-03-24 15:17:39
========================================================

Build: RKQ1.201112.002 test-keys
Build fingerprint: 'Xiaomi/renoir/renoir:11/RKQ1.201112.002/V12.5.8.0.RKICNXM:user/release-keys'
Bootloader: unknown
Radio: 4.0-c7-11.1873.2-1026_2256_b83f4dadbc,4.0-c7-11.1873.2-1026_2256_b83f4dadbc
Network: ,
Module Metadata version: 30
Kernel: Linux version 5.4.86-qgki-g481f7eca2ed5 (builder@m1-xm-ota-bd044.bj.idc.xiaomi.com) (Android (6443078 based on r383902) clang version 11.0.1 (https://android.googlesource.com/toolchain/llvm-project b397f81060ce6d701042b782172ed13bee898b79), LLD 11.0.1 (/buildbot/tmp/tmp6_m7QH b397f81060ce6d701042b782172ed13bee898b79)) #1 SMP PREEMPT Wed Oct 27 15:02:49 CST 2021
Command line: ramoops_memreserve=4M log_buf_len=256K rcupdate.rcu_expedited=1 rcu_nocbs=0-7 console=ttyMSM0,115200n8 androidboot.hardware=qcom androidboot.console=ttyMSM0 androidboot.memcg=1 lpm_levels.sleep_disabled=1 video=vfb:640x400,bpp=32,memsize=3072000 msm_rtb.filter=0x237 service_locator.enable=1 androidboot.usbcontroller=a600000.dwc3 swiotlb=0 loop.max_part=7 cgroup.memory=nokmem,nosocket pcie_ports=compat loop.max_part=7 iptable_raw.raw_before_defrag=1 ip6table_raw.raw_before_defrag=1 buildvariant=user  androidboot.verifiedbootstate=green androidboot.keymaster=1 androidboot.vbmeta.device=PARTUUID=65cc4597-

搜索关键字 VM TRACES AT LAST ANR 确认当前包名 Cmd line: com.test.test

------ 0.007s was the duration of 'VM TRACES JUST NOW' ------
------ VM TRACES AT LAST ANR (/data/anr/anr_2023-03-24-14-36-34-749: 2023-03-24 14:36:42) ------

----- pid 27325 at 2023-03-24 14:36:35 -----
Cmd line: com.test.test
Build fingerprint: 'Xiaomi/renoir/renoir:11/RKQ1.201112.002/V12.5.8.0.RKICNXM:user/release-keys'
ABI: 'arm64'
Build type: optimized
Zygote loaded classes=21457 post zygote classes=1862

后面的步骤和(1)一致

2. 集成了bugly之类第三方异常捕捉上报工具,这里会有详细的信息 定位方式如上

1679974685314(1).png

三. 问题发生原因

ANR(Application Not Responding) 应用程序无响应。如果你应用程序在UI线程被阻塞太长时间,就会出现ANR,通常出现ANR,系统会弹出一个提示提示框,让用户知道,该程序正在被阻塞,是否继续等待还是关闭。
ANR类型
出现ANR的一般有以下几种类型:
1:KeyDispatchTimeout(常见)
input事件在5S内没有处理完成发生了ANR。
logcat日志关键字:Input event dispatching timed out
2:BroadcastTimeout
前台Broadcast:onReceiver在10S内没有处理完成发生ANR。
后台Broadcast:onReceiver在60s内没有处理完成发生ANR。
logcat日志关键字:Timeout of broadcast BroadcastRecord
3:ServiceTimeout
前台Service:onCreate,onStart,onBind等生命周期在20s内没有处理完成发生ANR。
后台Service:onCreate,onStart,onBind等生命周期在200s内没有处理完成发生ANR
logcat日志关键字:Timeout executing service
4:ContentProviderTimeout
ContentProvider 在10S内没有处理完成发生ANR。
logcat日志关键字:timeout publishing content providers

ANR出现常见原因
1:主线程频繁进行耗时的IO操作:如数据库读写
2:多线程操作的死锁,主线程被block;
3:主线程被Binder 对端block;
4:System Server中WatchDog出现ANR;
5:service binder的连接达到上线无法和和System Server通信
6:系统资源已耗尽(管道、CPU、IO)

https://juejin.cn/post/6844903942841712648
https://juejin.cn/post/6844903715313303565#heading-4

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容