Android ANR简介

ANR(App not respond)是Android定义的一种稳定性问题类型;系统发出关键消息,同时发出此消息的超时消息。处理逻辑有两种情况:

  1. 关键消息被执行,超时消息被清除;ANR不会发生
  2. 超时消息被执行;触发ANR机制,通知AMS抓取堆栈,生成dropbox内容,kill目标进程

本专栏分为以下章节详细解析ANR:

稳定性问题ANR-input

稳定性问题ANR-广播

稳定性问题ANR-service

稳定性问题ANR- Activity

稳定性问题ANR-provide

简介

ANR检测点逻辑都在system_server进程中,假设如果system_server出现hang的场景,ANR逻辑有可能就不会被触发。而且ANR都是针对Android app的机制。因此每种机制中都会依据App当时的状态,如前台还是后台等行为,进行特殊处理。

本专栏中的所有代码实例基于android-14.0.0_r2

源码路径:http://aospxref.com/android-14.0.0_r2/

问题触发

所有的ANR都是AMS(ActivityManagerService)发起,执行appNotResponding保存问题的现场;执行的关键信息分为以下步骤:

第一步:在logcat event buffer中记录ANR发生

代码路径:链接

java 复制代码
EventLog.writeEvent(EventLogTags.AM_ANR, mApp.userId, pid, mApp.processName,
                    mApp.info.flags, annotation);

第二步:收集当前活跃的进程和Android核心服务的pid,抓取java堆栈和native堆栈

java 复制代码
StackTracesDumpHelper.dumpStackTraces

dump stack有两种方式:

  1. java进程首先发送kill -3 pid信号,由进程自身的signalcatch线程消费,如果超时使用native dump方式进行保存堆栈
  2. native进程使用kill -35 pid信号,此方式会有tombstoned进程负责保存native堆栈

第三步:在Dropbox中新增ANR问题记录

java 复制代码
mService.addErrorToDropBox("anr", mApp, mApp.processName, activityShortComponentName,
                parentShortComponentName, parentPr, null, report.toString(), tracesFile,
                null, new Float(loadingProgress), incrementalMetrics, errorId);

第四步:干掉进程;分为两种情况:前台进程弹框由用户决策;后台进程直接kill

问题分析

简单的ANR问题可以使用Android提供的如上原生方式就能定位问题;按上面流程走一遍,确定发生时间,获取anr trace文件;trace文件保存在两个地方:

  1. /data/anr/目录下,有anr开头,内容中包含包名,进程pid等信息
  2. /data/system/dropbox/目录下,有data_app_anr或者system_app_anr开头的文件,内容多了logcat和一些系统信息
相关推荐
安东尼肉店8 小时前
Android compose屏幕适配终极解决方案
android
2501_916007478 小时前
HTTPS 抓包乱码怎么办?原因剖析、排查步骤与实战工具对策(HTTPS 抓包乱码、gzipbrotli、TLS 解密、iOS 抓包)
android·ios·小程序·https·uni-app·iphone·webview
feiyangqingyun10 小时前
基于Qt和FFmpeg的安卓监控模拟器/手机摄像头模拟成onvif和28181设备
android·qt·ffmpeg
用户20187928316714 小时前
ANR之RenderThread不可中断睡眠state=D
android
煤球王子14 小时前
简单学:Android14中的Bluetooth—PBAP下载
android
小趴菜822714 小时前
安卓接入Max广告源
android
齊家治國平天下14 小时前
Android 14 系统 ANR (Application Not Responding) 深度分析与解决指南
android·anr
ZHANG13HAO14 小时前
Android 13.0 Framework 实现应用通知使用权默认开启的技术指南
android
【ql君】qlexcel14 小时前
Android 安卓RIL介绍
android·安卓·ril
写点啥呢14 小时前
android12解决非CarProperty接口深色模式设置后开机无法保持
android·车机·aosp·深色模式·座舱