AMS详解

文章详细描述了Android系统启动时AMS的作用,包括四大组件的调度管理,Activity启动过程中的socket通信与binder使用,以及ANR处理机制。重点讲解了Activity的启动流程,包括进程创建、资源加载、View绘制等关键步骤。
摘要由CSDN通过智能技术生成

初始化

systemService启动时候执行run方法 启动核心服务 拉起AMS

SystemServer.startBootStrapService

systemServer启动时机:zygote fork的第一个进程就是systemserver(ZygoteInit.startSystemServer 启动 system server 其中的ServiceManager 和zygote进程 均是由 init进程启动)

四大组件启动流程

前文讲了ams的初始化 解释了他是从哪来的 现在需要将ams是用来干什么的 主要做两件事 四大组件的调度与管理 以及 anr的处理

首先来看四大组件启动流程

1.Activity启动流程

这里涉及四个进程:launcher 

以点击shortcut为例 我们点击shortcut  input系统会接受input事件进行处理(这个就是input系统的事情了 和本文无关)最终将输入事件发送给了Launcher.startActivity 接着launcher将请求发送给ams 如果此时launcher处于resume状态 ams通过binder执行launcher onpuse 完成后 判断是否应用进程存在 如果不存在的话 则执行进程创建阶段

进程创建阶段:ams通过socket通知zygote进行进程创建 这个socket server在zygote创建时已创建 主要用于监听进程创建的请求(为什么不用binder  1.serviceManager和zygote启动虽然先于zygote 但是zygote是无法感知sm进程是否初始化完成 然后执行注册binder引用的操作 如果加了socket感知 过程太过复杂 2.zygote执行fork需要挂起所有子线程 只有主线程的状态和锁状态是可恢复的,因此如果执行fork,那么首先暂停binder线程池 请问,这个时候该怎么执行通信过程呢 3.安全性方面,socket也有权限校验,因此socket在安全性也是不输于binder的 4.效率方面 local socket进行通信使用两次拷贝,相对于binder的一次拷贝,效率确实是低了一点,但是整体效率并没有低很多,因此综上,zygote进行进程间通信选择socket而不是binder)

在zygote监听到进程创建请求后 执行fork操作 完事后 创建子进程binder线程池 执行AT.main函数

执行attach将自己注册到ams当中 最后创建looper

接着将attach的流程

子进程执行attach将自己注册到ams当中 ams调用attachapplication通过binder通知子进程执行bindApplication:handleBindApplication:1.创建application的context 2.创建loadedapk 3.加载res资源 4. 创建application对象  

主要讲讲加载res资源这一段 这里set res-> get res 最终 会走到createClassLaoder 在这里会触发dex加载流程:我的理解 dex加载就是遍历dex文件进行加载?

完成了 res资源的加载 接着创建application 在这些都完成后 我们回到ams的attachApplication当中接着执行activity的创建

这里会最终会调用到ActivityTaskSupvisior.realStartActivity 这里创建了两个item 一个是launchActivityItem 另一个是resume

先讲launch:反射创建Activity 执行attach创建窗口的phoneWindow 最后执行onCreate声明周期

resume:执行resume声明周期 addView开启绘制 创建rootViewImp 最终setView开启绘制动作了

这就是view绘制相关的了 后面接着更新View绘制逻辑

View绘制流程

前面讲到了 addView开启绘制逻辑整个流程如下

1.requestLayout  申请画布

2.doTraversal:待到接收到vsync信号时开启绘制 分为draw测量 measure layout三步

在完成traversal之后需要render thread进行渲染 rt线程首先dequeue buffer从sf进程获取buffer queue 如果是第一帧的话 则会在额外调用一次reuqestBuffer的操作(这里是申请GragphBuffer buffer有了它才是可用的 不然只是slot 空闲不可用) 如果是3buffer的话 则前三帧都会执行request buffer的操作 dequeue buffer之后 此时rt线程进行渲染工作 完成后 执行queue buffer将buffer发送给sf进程 sf进行合成 完成后将 buffer传递给 hwc serevice hwc service 进行进一步工作 最后交由crtc commit 进行送显 一般进行卡顿分析 按着这个链路进行分析 某一个步骤超出时限都是卡顿隐患

 前面关于 绘制流程写的较为简单 中间省略了较多可拓展的知识 比如 bufer的产生 buffer状态变化 以及为什么是3buffer等 这些后面在一个专题内整理吧

前面就是activity的整个启动流程了 在这里 可以看出 ams的两个作用:activity的调度与管理 以及进程的管理

anr的处理

anr分为四种类型 input类型 anr 和 service broadcast receiver这四种类型anr

按照大类可以分为埋雷式anr:后三种

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值