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

网站登录不上网盘网页版

网站登录不上,网盘网页版,网站备案和不备案的,电暖怎么做网站前言 关于Service的ANR场景还是比较少见的,它的ANR设计原理也是比较简单,在很多监控的方案中都可以看得到 ANR触发场景 通过查阅Android官方文档,我们知道出现以下任何情况,系统都会针对我们的应用触发ANR: Servic…

前言

关于Service的ANR场景还是比较少见的,它的ANR设计原理也是比较简单,在很多监控的方案中都可以看得到

ANR触发场景

通过查阅Android官方文档,我们知道出现以下任何情况,系统都会针对我们的应用触发ANR:

  • Service Timeout:比如前台服务在20s内未执行完成,后台服务Timeout时间是前台服务的10倍,200s
  • BroadcastQueue Timeout:比如前台广播在10s内未执行完成,后台60s
  • ContentProvider Timeout:内容提供者,在publish过超时10s
  • InputDispatching Timeout: 输入事件分发超时5s,包括按键和触摸事件

Service的工作机制

在了解Service触发ANR之前,要先了解Service的工作机制

在这里插入图片描述

  • ContextImpl:ContextImpl是Android一个很重要的数据结构,它是Context的具体实现,Context中的大部分逻辑都是由ContextImpl来完成
  • ActivityManagerService:简称AMS,继承自ActivityManagerNavite(简称AMN),AMN继承自Binder并实现了IActivityManager这个Binder接口,因此AMS也是一个Binder,它是IActivityManager的具体实现
  • ActiveServices:辅助AMS进行Service管理的的类,包括Service的启动,绑定和停止等
  • ServiceRecord:Service的记录类,可以简单理解为Service的一个栈
  • ActivityThread:ActivityThread并不是一个Thread类,但代表了Android的主线程,其中的main方法是整个APP的入口,主要在Application进程中管理执行主线程,以及调度和执行活动和广播,和活动管理请求的其它操作

Service的ANR机制

  1. 埋炸弹:指的是在启动Service前,发送延时消息,如果Service在指定的是时间没有拆炸弹,则会引爆ANR
  2. 拆炸弹:在指定时间内,顺利运行Service服务,运行完成之后会拆掉一开始预埋下来的炸弹
  3. 引爆炸弹:在指定的时间未成功顺利运行Service服务,则会处理延时消息,引发ANR弹窗,引爆炸弹

Service埋定时炸弹

Service的启动过程分为两种

  1. 通过StartService启动Service
  2. 通过bindService启动Service

两种启动方式最终的调用链都来到ActiveServices.realStartServiceLocked()

private void realStartServiceLocked(ServiceRecord r, ProcessRecord app,IApplicationThread thread, int pid, UidRecord uidRecord, boolean execInFg,boolean enqueueOomAdj) throws RemoteException {......// 1.发送delay消息(SERVICE_TIMEOUT_MSG)bumpServiceExecutingLocked(r, execInFg, "create", null /* oomAdjReason */);try {// 2.创建Service对象,并且调用onCreate()thread.scheduleCreateService(r, r.serviceInfo,mAm.compatibilityInfoForPackage(r.serviceInfo.applicationInfo),app.mState.getReportedProcState());} catch (DeadObjectException e) {Slog.w(TAG, "Application dead when creating service " + r);mAm.appDiedLocked(app, "Died when creating service");throw e;} finally {......}......
}private boolean bumpServiceExecutingLocked(ServiceRecord r, boolean fg, String why,@Nullable String oomAdjReason) {......scheduleServiceTimeoutLocked(r.app);......
}void scheduleServiceTimeoutLocked(ProcessRecord proc) {if (proc.mServices.numberOfExecutingServices() == 0 || proc.getThread() == null) {return;}Message msg = mAm.mHandler.obtainMessage(ActivityManagerService.SERVICE_TIMEOUT_MSG);msg.obj = proc;mAm.mHandler.sendMessageDelayed(msg, proc.mServices.shouldExecServicesFg()? SERVICE_TIMEOUT : SERVICE_BACKGROUND_TIMEOUT);
}

ActiveServices.realStartServiceLocked()做了两个事情

  1. 通过mHandler发送延时消息,在这里将会埋下炸弹
  2. 创建Service正式执行Service的启动逻辑,并且调用ServiceonCreate()

从发送的延时时间可以看出,Service的炸弹是指前台服务Timeout时间为20s,后台服务Timeout时间是前台服务的10倍,200s

static final int SERVICE_TIMEOUT = 20*1000;
static final int SERVICE_BACKGROUND_TIMEOUT = SERVICE_TIMEOUT * 10;

Service拆炸弹

Service正常运行情况下,最终会执行到ActivityThreadhandleCreateService方法

private void handleCreateService(CreateServiceData data) {......try {ActivityManager.getService().serviceDoneExecuting(data.token, SERVICE_DONE_EXECUTING_ANON, 0, 0);} catch (RemoteException e) {throw e.rethrowFromSystemServer();}......
}

ActiveServices我们找到了这个移除SERVICE_TIMEOUT_MSG消息的方法serviceDoneExecutingLocked

private void serviceDoneExecutingLocked(ServiceRecord r, boolean inDestroying,boolean finishing, boolean enqueueOomAdj) {......if (psr.numberOfExecutingServices() == 0) {if (DEBUG_SERVICE || DEBUG_SERVICE_EXECUTING) Slog.v(TAG_SERVICE_EXECUTING,"No more executingServices of " + r.shortInstanceName);mAm.mHandler.removeMessages(ActivityManagerService.SERVICE_TIMEOUT_MSG, r.app);} ......
}

Service引爆炸弹

在创建Service之前如果消息没被移除,也就代表着Service没有被顺利的执行下来,就会导致Handler去处理当前的Timeout消息

final class MainHandler extends Handler {public MainHandler(Looper looper) {super(looper, null , true);}@Overridepublic void handleMessage(Message msg) {...// 1.处理消息case SERVICE_TIMEOUT_MSG: {mServices.serviceTimeout((ProcessRecord) msg.obj);}...}
}void serviceTimeout(ProcessRecord proc) {String anrMessage = null;......if (anrMessage != null) {// 2.触发ANR弹窗mAm.mAnrHelper.appNotResponding(proc, anrMessage);}
}

appNotResponding方法内会开始生成trace文件等信息,然后通过ActivityManagerServicemUiHandler发送SHOW_NOT_RESPONDING_UI_MSG展示ANR弹窗

http://www.lbrq.cn/news/2585809.html

相关文章:

  • 哪有做建筑设计的网站免费大数据分析网站
  • 网站开发技术有包括厦门seo优化多少钱
  • 用html做网站的背景图怎么弄郑州今天刚刚发生的新闻
  • 上海市人民政府门户网站郑州网站优化软件
  • 网站建设的优势烟台网络推广
  • 网站建设怎样宣传比较好百度搜索高级搜索
  • 修改网站版权关键词在线采集
  • 国外有哪些网站做推广的比较好销售平台排名
  • 廊坊网站制作谷歌关键词搜索工具
  • 提供手机自适应网站湖南seo公司
  • sqlite 做网站数据库怎么学seo基础
  • 建设一个一般网站需要多少钱营销qq官网
  • 帝国cms 网站地图 自定义营销型网站建设流程
  • 做静态页面的网站今天的新闻头条
  • 涂料网站设计百度广告关键词价格表
  • wordpress海报插件独立站seo是什么意思
  • 创新平台网站建设方案模板网站免费
  • 赣州淘捷网络科技有限公司河北网站seo外包
  • 晋中网站公司云巅seo
  • 南通市住房和建设局网站广告软文小故事200字
  • 向国旗致敬做时代新人网站网络科技公司网站建设
  • 网站搜索优化靠谱seo研究中心培训机构
  • 秦皇岛北京网站建设怎么接推广
  • 网站开发调研站长之家网站排行榜
  • 北京网站改版营销推广外包
  • 东莞南城网站开发公司免费网站大全
  • 网站建设培训会上的讲话查淘宝关键词排名软件有哪些
  • 百度竞价镇江seo网页的基础知识
  • 做局域网站数据库客户管理软件哪个好用
  • 织梦门户网站源码专业代写软文
  • Qt 自动无法加载数据库为空
  • 设计模式-创建型-工厂模式
  • 机器学习——决策树(DecisionTree)+ 过采样 + 交叉验证 案例:电信客户流失数据
  • 【LeetCode刷题指南】--对称二叉树,另一颗树的子树
  • 计算机网络(TCP篇)
  • C的运算符与表达式