我们在Activity.onCreate甚至更早的Application.onCreate里面就可以调用Binder机制了,这说明应用启动Binder比Application的生命周期更早。
上图是应用进程启动的流程,AMS在组件启动的过程中要是发现组件所在的进程尚未启动,就会通过本地socket通知Zygote启动进程,Zygote在应用进程启动完成之后会将启动的子进程的pid返回给AMS,应用进程启动完成之后,就会通过Binder通知AMS已经启动完成,并将自己的Binder句柄在AMS中注册。
从应用进程启动的流程中,我们可以看到在应用进程启动完成之后,应用进程的Binder机制就已经启动了,在Zygoto通过fork之后,对进程资源进行初始化的过程中完成了Binder的启动。
下面首先来看看Zygoto启动进程的流程
我们知道Zygote是有init进程启动的,Zygote启动之后,就会进入Loop循环读取本地socket传递来的消息,Zygote处理消息的函数runOnce:
首先Zygote通过readArgumentList读取socket里面的参数,然后通过fork的方式创建一个子进程,pid等于0表示当前是在子进程中,在子进程中通过handleChildProc来初始化子进程的相关资源。
其中在nativeZygoteInit函数中,通过open("/dev/binder")来启动binder驱动,binder驱动启动成功之后,就会将binder驱动映射到当前进程的内存空间,当前进程中就可以通过binder机制进行跨进程交互了。
完整的binder启动流程是,Zygote在fork出子进程之后,在子进程中进行进程的初始化,首先启动binder驱动,binder驱动启动成功之后,会通过mmap将binder驱动映射到当前进程的内存空间中,然后注册一个单列的binder线程,并在binder线程中启动loop循环,不断的与binder驱动进行交互。