ANR分析

Android ANR机制介绍

ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。

Android为什么要引入ANR

android ui 被设计成非线程安全的(个人认为主要是为了简单),这就要求满足两点:

  1. 不能在非ui线程中操作ui.
  2. 不能阻塞ui线程。

其中第二个就为ANR埋下了伏笔,既然不能阻塞ui线程,那么如果阻塞了,用户会得到什么交互呢,这就是ANR.告知用户应用程序发生了阻塞ui线程的操作,但是方式简单粗暴,继续等待或者Force Close。其实体验一点不好。这也就对我们程序员有了更高的要求,杜绝黄赌毒,杜绝ANR.

发生ANR场景

  1. Service Timeout : 服务前台在20s,后台10s内未执行完成。
  2. BroadcastQueue Timeout : 广播前台10s,后台60s内未执行完成。
  3. ContentProvider Timeout : 内容提供器10s未执行完成。
  4. InputDispatching Timeout: 输入事件分发超时,5s。 包含按键与触屏。
 // How long we wait for a service to finish executing.
    static final int SERVICE_TIMEOUT = 20*1000; // 前台

    // How long we wait for a service to finish executing.
    static final int SERVICE_BACKGROUND_TIMEOUT = SERVICE_TIMEOUT * 10; // 后台


 // How long we allow a receiver to run before giving up on it.
    static final int BROADCAST_FG_TIMEOUT = 10*1000;  // 前台
    static final int BROADCAST_BG_TIMEOUT = 60*1000;  // 后台

// How long we wait until we timeout on key dispatching.
    static final int KEY_DISPATCHING_TIMEOUT = 5*1000;

// How long we wait for an attached process to publish its content providers
    // before we decide it must be hung.
    static final int CONTENT_PROVIDER_PUBLISH_TIMEOUT = 10*1000;

注意:
android的四大组件默认都在主线程中运行的,特别提醒,Service和Broadcast组件也是在主线程中运行的。不要以为Service是在后台运行的,就不在主线程运行。Android提IntentService可以不在主线程执行任务,看源码就会发现其实关联一个HandlerThread.
顺便说一下,Handler默认也是在主线程中运行的,持有的main thread的looper.如果让handler不在主线程执行,需要绑定其它线程的looper.

ANR处理

  1. java层的处理:
    所有的java进程都运行在java虚拟机中,当应用发生ANR时,其最终的一个环节是向目标进程通过kill - 3,发送信号SIGNAL_QUIT.Android进程收到SIGQUIT时,虚拟机会捕获这个信号,并输出相应的traces信息,保存到/data/anr/traces.txt中。

  2. native层的处理:
    native进程在发生ANR时,debuggerd服务接收到系统发来的DEBUGGER_ACTION_DUMP_BACKTRACE命令,最后通过dump_backtrace()将日志输出到/data/anr/traces.txt。

CPU和内存的关键指标含义

CPU的使用时间:读取/proc/stat

  • user: 用户进程的cpu使用时间
  • nice: 降低过优先级进程的cpu的使用时间,linux进程都是有优先级的,这个优先级可以进行动态调整,譬如进程初始化优先级的值设为10,运行时降低为8,那么修正值为-2就是nice.android系统将user和nice这两个时间归类成user.
  • sys : 内核进程的cpu使用时间
  • idle: cpu等待IO的时间
  • hw irq : 硬件中断的时间,如果外设出现故障,需要通过硬件终端通知CPU保存现场,发生上下文切换时间就是CPU的硬件中断时间。
  • sw irq: 软件中断的时间,同硬件中断一样,如果软件要求CPU中断,同上下文切换时间就是CPU的软件中断时间。

CPU负载:读取/proc/loadavg

统计最近1分钟、5分钟、15分钟内cpu的平均活动进程数。CPU的负载就是要处理的任务数。

手机内存:读取/proc/meminfo

dumpsys meminfo命令的输出结果分以下4部分:

序列 类型 排序 解释
1 process PSS 以进程的PSS从大到小依次排序显示,每行显示一个进程
2 oom adj PSS Native/System/Persistent/Foreground/Visible/Perceptible/A Services/Home/B Services/Cached,分别显示每类的进程情况;一般而言,占用内存越多,oom_adj就越大,也就越有可能被选中。OOM异常的时候会根据这个表单从下往上杀掉进程释放内存
3 category PSS 以Dalvik/Native/.art mmap/.dex map等划分的各类进程的总PSS情况
4 total 总内存、剩余内存、可用内存、其他内存
root@phone:/ # cat /proc/meminfo
MemTotal:         883248 kB   //RAM可用的总大小 (即物理总内存减去系统预留和内核二进制代码大小)
MemFree:           62136 kB   //RAM未使用的大小
MemAvailable:     192336 kB   
Buffers:            1648 kB   //用于文件缓冲
Cached:           175404 kB   //用于高速缓存
SwapCached:         5392 kB   //用于swap缓存

对于cache和buffer也是系统可以使用的内存。所以系统当前总的可用内存为 MemFree+Buffers+Cached。

技术分析

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

推荐阅读更多精彩内容

  • 一.ANR是什么 Application Not Responding,字面意思就是应用无响应,稍加解释就是用户的...
    silentleaf阅读 63,516评论 7 93
  • traces文件分析 简单了解ANR各个应用进程和系统进程的函数堆栈信息都输出到了/data/anr/traces...
    youseewhat阅读 29,799评论 0 27
  • 什么是ANR ANR(Application Not Responding)就是应用在规定的时间内没有响应用户输入...
    lbtrace阅读 3,366评论 3 9
  • 关于这个体制化啊原谅我书浅 大概是肖申克的救赎看多了吧 生活每天都是一模一样 就部安班?我觉得不是啊 有一点我每天...
    博博博博博了个文阅读 256评论 0 0
  • 你是孩童眼角的无邪 是诗人眼中的偏执 是我用尽一生都戒不掉的强迫症
    何以言喻阅读 301评论 2 5