应用启动流程

从launcher点击图标启动应用的流程

点击事件的流转

input 是Android系统最常见的事件驱动之一,用户的点击、滑动、长按等操作,都属于 input 事件驱动,其中跑在 SystemServer进程的两个 native 循环线程InputReader 和 InputDispatcher就是input的核心,负责读取和分发 Input 事件。整个处理过程大致流程如下:

1、触摸屏每隔几毫秒扫描一次,如果有触摸事件,那么把事件上报到对应的驱动,InputReader负责从EventHub里面把Input事件读取出来,后放入 inboundqueue,即“iq”队列,然后交给 InputDispatcher 进行事件分发;

2、InputDispatcher在拿到 InputReader获取的事件之后,对事件进行包装后放入 outboundqueueue,即“oq”队列,寻找并分发到各个目标窗口App的事件;

3、WaitQueue队列“wq“里面记录的是已经派发给 App的事件,但是 App还在处理没有返回处理成功的事件;

4、PendingInputEventQueue队列“aq”中记录的是应用需要处理的Input事件,这里可以看到input事件已经传递到了应用进程;

在perfettotrace 中,inputreader、inputdispatcher、iq队列、oq队列、wq队列、wq队列都在system_server进程之中;每一个应用都有自己的aq队列。

5、deliverInputEvent 标识 App UI Thread 被 Input 事件唤醒;App 响应处理Input 事件,内部会在其界面View树中传递处理。

6、InputReader从trace里可以看到Input按下去的时候AppLaunch_dispatchPtr:Down和Input抬起的时候AppLaunch_dispatchPtr:Up,分析启动流程的时候可以从AppLaunch_dispatchPtr:Up开始。

应用启动流程

1、桌面接收到图标的点击事件,Launcher进程采用BinderIPC向system_server进程发送startActivity请求。

2、system_server进程接收到请求后,向zygote进程发送创建进程的请求。

3、zygote进程fork出新的子进程,即App进程;

4、App进程,通过Binder IPC向system_server进程发送attachApplication请求。

5、system_server进程在接收到请求后,进行一系列准备工作后,再通过Binder IPC向App进程发送scheduleLaunchActivity请求。

6、App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息。

7、主线程在收到Message后,通过发送机制创建目标Activity,并回调Activity.onCreate()等方法。

8、App正式启动,开始进入Activity生命周期,执行onCreate/onstart/onResume方法。

9、应用主线程绘制首帧,首帧绘制、渲染、合成、送显。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值