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和一些系统信息
相关推荐
终端安全笔记1 小时前
描述文件、企业证书、MDM 不是三个名字,是三层
android·ios·智能手机
字节暗面2 小时前
一次游戏安全SO静态分析记录:腾讯ACE与FairGuard加固强度对比
android·逆向工程·游戏加固
传奇开心果编程2 小时前
【Jetpack Compose基础语法学与练】第9课 SideEffect副作用 + LaunchedEffect,处理异步任务和生命周期
android·学习·ui·kotlin·android jetpack
2401_833269304 小时前
RecyclerView多布局详解
android
v_34836087624 小时前
Android_8 zygote启动分析
android
消失的旧时光-19435 小时前
Android 系统层扫盲 11:JNI 到底是什么?Java / Kotlin 是怎么调用 C/C++ 的?
android·binder·zygote·system_server·aops
mmsx5 小时前
Android 地图几万要素卡成幻灯片?顶点缓冲批上传与显存复用
android·opengl·地图·栅格
北京自在科技15 小时前
谷歌 Find Hub 迎来新版本更新
android·安卓
古法安卓21 小时前
Android-休眠唤醒后onLocationChanged没有数据问题排查
android·java·android studio
Htr_1 天前
Creem 2.0 使用指南:面向 AI 构建时代的资金平台
android·数据库·人工智能·ui·photoshop