从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、应用主线程绘制首帧,首帧绘制、渲染、合成、送显。