当前位置: 首页 > news >正文

雄安专业网站建设方案内蒙建设工程信息网站

雄安专业网站建设方案,内蒙建设工程信息网站,阿里百秀wordpress,php网站开发源代码系列文章目录 提示#xff1a;这里可以添加系列文章的所有文章的目录#xff0c;目录需要自己手动添加 例如#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言ANR流程概览ANR触发机制一、service超时机制二、broadcast超时机制三、provider超…系列文章目录 提示这里可以添加系列文章的所有文章的目录目录需要自己手动添加 例如第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言ANR流程概览ANR触发机制一、service超时机制二、broadcast超时机制三、provider超时机制四、input超时机制ANR信息收集Question 前言 不论从事安卓应用开发还是安卓系统研发应该都遇到应用无响应ANRApplication Not Responding问题当应用程序一段时间无法及时响应则会弹出ANR对话框让用户选择继续等待还是强制关闭。 那么哪些场景会造成ANR呢 Service Timeout:比如前台服务在20s内未执行完成 BroadcastQueue Timeout比如前台广播在10s内未执行完成 ContentProvider Timeout内容提供者,在publish过超时10s; InputDispatching Timeout: 输入事件分发超时5s包括按键和触摸事件。 ANR流程概览 我们通过一张流程图来了解整个ANR的流程 无论是哪种类型的ANR哪怕是native层的ANR最终也会通知到AnrHelper类的appNotResponding方法。所以我们从这个方法开始了解整个ANR的流程。我们用来区分ANR的四种不同类型其实也就是appNotResponding这个方法中的annotation不同而已而ANR本身是不去分类型的。 appNotResponding方法中主要是生成AnrRecord对象加入到mAnrRecords集合中。然后调用startAnrConsumerIfNeeded方法。startAnrConsumerIfNeeded方法主要是通过cas进行判断避免两个ANR线程同时执行。如果没有冲突的话则开启AnrConsumerThread线程对mAnrRecords中的对象进行消费。AnrConsumerThread的run方法中就是从mAnrRecords中取出对象这些对象第一条中添加的。通过AnrRecord自身的appNotResponding方法进行消费。appNotResponding方法就是整个ANR流程的核心执行逻辑了。总结一下其实主要分为两大块 生成ANR的相关log以及日志并打印或保存触发ANR超时机制弹出应用无响应的框 ANR日志生成可查看ANR原理篇 - ANR信息收集过程 下面篇章主要看下ANR触发机制。 ANR触发机制 ANR是一套监控Android应用响应是否及时的机制可以把发生ANR比作是引爆炸弹整个流程包含三部分组成 1.埋定时炸弹中控系统(system_server进程)启动倒计时在规定时间内如果目标(应用进程)没有干完所有的活则中控系统会定向炸毁(杀进程)目标。 2.拆炸弹在规定的时间内干完工地的所有活并及时向中控系统报告完成请求解除定时炸弹则幸免于难。 3.引爆炸弹中控系统立即封装现场抓取快照搜集目标执行慢的罪证(traces)便于后续的案件侦破(调试分析)最后是炸毁目标。 常见的ANR有service、broadcast、provider以及input。 更多细节详见下面两篇 ANR原理篇 - service/broadcast/provider超时机制 ANR原理篇 - Input超时机制 一、service超时机制 下面来看看埋炸弹与拆炸弹在整个服务启动(startService)过程所处的环节 图解 客户端(App进程)向中控系统(system_server进程)发起启动服务的请求中控系统派出一名空闲的通信员(binder_1线程)接收该请求紧接着向组件管家(ActivityManager线程)发送消息埋下定时炸弹通讯员1号(binder_1)通知工地(service所在进程)的通信员准备开始干活通讯员3号(binder_3)收到任务后转交给包工头(main主线程)加入包工头的任务队列(MessageQueue)包工头经过一番努力干完活(完成service启动的生命周期)然后等待SharedPreferences(简称SP)的持久化包工头在SP执行完成后立刻向中控系统汇报工作已完成中控系统的通讯员2号(binder_2)收到包工头的完工汇报后立刻拆除炸弹。如果在炸弹倒计时结束前拆除炸弹则相安无事否则会引发爆炸(触发ANR) 更多细节详见startService启动过程分析。 二、broadcast超时机制 broadcast跟service超时机制大抵相同如下图所示。 图解 客户端(App进程)向中控系统(system_server进程)发起发送广播的请求中控系统派出一名空闲的通信员(binder_1)接收该请求转交给组件管家(ActivityManager线程)组件管家执行任务(processNextBroadcast方法)的过程埋下定时炸弹组件管家通知工地(receiver所在进程)的通信员准备开始干活通讯员3号(binder_3)收到任务后转交给包工头(main主线程)加入包工头的任务队列(MessageQueue)包工头经过一番努力干完活(完成receiver启动的生命周期)然后等待SP工人完成SP数据的持久化工作便可以向中控系统汇报工作完成中控系统的通讯员2号(binder_2)收到包工头的完工汇报后立刻拆除炸弹。如果在倒计时结束前拆除炸弹则相安无事否则会引发爆炸(触发ANR) 对于静态注册的广播在超时检测过程还多一个步骤需要检测SP位于第6步和第7步之间。 SP的apply将修改的数据项更新到内存然后再异步同步数据到磁盘文件因此很多地方会推荐在主线程调用采用apply方式避免阻塞主线程但静态广播超时检测过程需要SP全部持久化到磁盘如果过度使用apply会增大应用ANR的概率更多细节详见系统SharedPreferences工作过程。 Google这样设计的初衷是针对静态广播的场景下保障进程被杀之前一定能完成SP的数据持久化。因为在向中控系统汇报广播接收者工作执行完成前该进程的优先级为Foreground级别高优先级下进程不但不会被杀而且能分配到更多的CPU时间片加速完成SP持久化。更多细节详见Android Broadcast广播机制。 三、provider超时机制 provider的超时是在provider进程首次启动的时候才会检测当provider进程已启动的场景再次请求provider并不会触发provider超时。 图解 客户端(App进程)向中控系统(system_server进程)发起获取内容提供者的请求中控系统派出一名空闲的通信员(binder_1)接收该请求检测到内容提供者尚未启动则先通过zygote孵化新进程新孵化的provider进程向中控系统注册自己的存在中控系统的通信员2号接收到该信息后向组件管家(ActivityManager线程)发送消息埋下炸弹通信员2号通知工地(provider进程)的通信员准备开始干活通讯员4号(binder_4)收到任务后转交给包工头(main主线程)加入包工头的任务队列(MessageQueue)包工头经过一番努力干完活(完成provider的安装工作)后向中控系统汇报工作已完成中控系统的通讯员3号(binder_3)收到包工头的完工汇报后立刻拆除炸弹。如果在倒计时结束前拆除炸弹则相安无事否则会引发爆炸(触发ANR) 更多细节详见理解ContentProvider原理。 四、input超时机制 input的超时检测机制跟service、broadcast、provider截然不同 为了更好的理解input过程先来介绍两个重要线程的相关工作 InputReader线程负责通过EventHub(监听目录/dev/input)读取输入事件一旦监听到输入事件则放入到InputDispatcher的mInBoundQueue队列并通知其处理该事件InputDispatcher线程负责将接收到的输入事件分发给目标应用窗口分发过程使用到3个事件队列 mInBoundQueue用于记录InputReader发送过来的输入事件outBoundQueue用于记录即将分发给目标应用窗口的输入事件waitQueue用于记录已分发给目标应用且应用尚未处理完成的输入事件 input的超时机制并非时间到了一定就会爆炸而是处理后续上报事件的过程才会去检测是否该爆炸所以更像是扫雷的过程具体如下图所示 图解 InputReader线程通过EventHub监听底层上报的输入事件一旦收到输入事件则将其放至mInBoundQueue队列并唤醒InputDispatcher线程InputDispatcher开始分发输入事件设置埋雷的起点时间。先检测是否有正在处理的事件(mPendingEvent)如果没有则取出mInBoundQueue队头的事件并将其赋值给mPendingEvent且重置ANR的timeout否则不会从mInBoundQueue中取出事件也不会重置timeout。然后检查窗口是否就绪(checkWindowReadyForMoreInputLocked)满足以下任一情况则会进入扫雷状态(检测前一个正在处理的事件是否超时)终止本轮事件分发否则继续执行步骤3。 对于按键类型的输入事件则outboundQueue或者waitQueue不为空对于非按键的输入事件则waitQueue不为空且等待队头时间超时500ms 当应用窗口准备就绪则将mPendingEvent转移到outBoundQueue队列当outBoundQueue不为空且应用管道对端连接状态正常则将数据从outboundQueue中取出事件放入waitQueue队列InputDispatcher通过socket告知目标应用所在进程可以准备开始干活App在初始化时默认已创建跟中控系统双向通信的socketpair此时App的包工头(main线程)收到输入事件后会层层转发到目标窗口来处理包工头完成工作后会通过socket向中控系统汇报工作完成则中控系统会将该事件从waitQueue队列中移除。 input超时机制为什么是扫雷而非定时爆炸呢 是由于对于input来说即便某次事件执行时间超过timeout时长只要用户后续在没有再生成输入事件则不会触发ANR。 这里的扫雷是指当前输入系统中正在处理着某个耗时事件的前提下后续的每一次input事件都会检测前一个正在处理的事件是否超时进入扫雷状态检测当前的时间距离上次输入事件分发时间点是否超过timeout时长。如果完成前一个输入事件则会重置ANR的timeout从而不会爆炸。 ANR信息收集 对于service、broadcast、provider、input发生ANR后中控系统会马上去抓取现场的信息用于调试分析。收集的信息包括如下 将am_anr信息输出到EventLog也就是说ANR触发的时间点最接近的就是EventLog中输出的am_anr信息收集以下重要进程的各个线程调用栈trace信息保存在data/anr/traces.txt文件 当前发生ANR的进程system_server进程以及所有persistent进程audioserver, cameraserver, mediaserver, surfaceflinger等重要的native进程CPU使用率排名前5的进程 将发生ANR的reason以及CPU使用情况信息输出到main log将traces文件和CPU使用情况信息保存到dropbox即data/system/dropbox目录对用户可感知的进程则弹出ANR对话框告知用户对用户不可感知的进程发生ANR则直接杀掉 整个ANR信息收集过程比较耗时其中抓取进程的trace信息每抓取一个等待200ms可见persistent越多等待时间越长。 关于抓取trace命令对于Java进程可通过在adb shell环境下执行kill -3 [pid]可抓取相应pid的调用栈 对于Native进程在adb shell环境下执行debuggerd -b [pid]可抓取相应pid的调用栈。 对于ANR问题发生后的蛛丝马迹(trace)在traces.txt和dropbox目录中保存记录。 更多细节详见理解Android ANR的信息收集过程 有了现场信息可以调试分析先定位发生ANR时间点然后查看trace信息接着分析是否有耗时的message、binder调用锁的竞争CPU资源的抢占以及结合具体场景的上下文来分析调试手段就需要针对前面说到的message、binder、锁等资源从系统角度细化更多debug信息这里不再展开后续再以ANR案例来讲解。 作为应用开发者应让主线程尽量只做UI相关的操作避免耗时操作比如过度复杂的UI绘制网络操作文件IO操作避免主线程跟工作线程发生锁的竞争减少系统耗时binder的调用谨慎使用sharePreference注意主线程执行provider query操作。简而言之尽可能减少主线程的负载让其空闲待命以期可随时响应用户的操作。 Question 有哪些路径会引发ANR? 答案是从埋下定时炸弹到拆炸弹之间的任何一个或多个路径执行慢都会导致ANR以service为例可以是service的生命周期的回调方法(比如onStartCommand)执行慢可以是主线程的消息队列存在其他耗时消息让service回调方法迟迟得不到执行可以是SP操作执行慢可以是system_server进程的binder线程繁忙而导致没有及时收到拆炸弹的指令。另外ActivityManager线程也可能阻塞出现的现象就是前台服务执行时间有可能超过10s但并不会出现ANR。 发生ANR时从trace来看主线程却处于空闲状态或者停留在非耗时代码的原因有哪些 可以是抓取trace过于耗时而错过现场可以是主线程消息队列堆积大量消息而最后抓取快照一刻只是瞬时状态可以是广播的“queued-work-looper”一直在处理SP操作。 致谢 理解Android ANR的触发原理 http://gityuan.com/2016/07/02/android-anr/ ANR信息收集过程 http://gityuan.com/2016/12/02/app-not-response/ Intpu原理分析 http://gityuan.com/2017/01/01/input-anr/ 彻底理解安卓应用无响应机制 http://gityuan.com/2019/04/06/android-anr/ ANR显示和日志生成原理讲解
http://www.tj-hxxt.cn/news/130870.html

相关文章:

  • 房产中介网站建设管理wordpress发不文章不按顺序怎么办
  • 做国际贸易网站要什么条件wordpress制作小说网站模板
  • 航天桥网站建设七牛 wordpress 插件
  • 旅游网站的建设的意义wap 网站开发
  • 网易考拉的网站建设做网站网站关键词是什么
  • 团购网站经营模式工业产品外观设计公司
  • 网站倍攻击网站建设实训不足
  • 网站建设功能评价指标wordpress网站设置关键词设置
  • 前段模板的网站在线优化网站
  • 网站 成本建设企业网站的好处是什么
  • 公司网站建设有哪些公司可以做麦包包网站建设特点
  • 制作公司网站用什么软件自媒体app推广是做什么的
  • 图文店做网站有用处吗新闻稿
  • 网站建设以及seo化妆品应如何网站建设定位
  • asp.net 网站建设wordpress netease
  • 一级a做爰小说免费网站做网站用什么服务器好
  • 关于网站建设的知识cnzz网站建设
  • 网站建设网站排名wordpress背景飘带
  • 网站页尾设计网站设计的基本步骤和方法
  • 网站服务内容怎样选网站建设费用设计
  • 福州网站推广排名创意设计公司业务范围
  • 福州专业网站建设推广费用利尔化学股票
  • 织梦网站漏洞修复手机代理
  • 个人代做网站扬州网站建设myvodo
  • 怎样做公司官方网站如何建网络营销网站
  • 学校建设网站前的市场分析博客 系统 wordpress
  • 网站设计目的网页设计结束语
  • 重庆观音桥旅游攻略seo优化服务是什么意思
  • asp连接数据库做登录网站完整下载ui设计师面试
  • 衡阳电商网站建设谷歌广告联盟怎么做