以SurfaceFlinger为例,看下SF是怎么注册到ServiceManager中的
如上图所示,surfaceflinger注册的主要流程如下:
- setThreadPoolMaxThreadCount(4)设置线程池最大容量
- ProcessState::self()打开binder设备,设置当前进程fd支持的最大binder线程池容量, mmap将文件内容映射成一个内存页,用户空间的虚拟内存地址与文件进行映射(绑定).
- startThreadPool开启线程池
- defaultServiceManager获取本地代理BpServiceManager
- 然后依次调用BpServiceManager.addService-->BpBinder.transact-->IPCThreadState.transact
- 在IPCThreadState.transact对请求的数据进行打包,然后通过ioctl与已经打开的binder设备驱动进行通信
总结:
- surfaceflinger发送一个BC_TRANSACTION事务给Binder驱动。
- Binder驱动收到该事务之后,对请求数据进行解析,在Kernel中新建了surfaceflinger对应的Binder实体,并将在ServiceManager的进程上下文中添加了该Binder实体的Binder引用。
- 解析完数据之后,新增一个待处理事务并提交到ServiceManager的待处理事务列表中;接着,就唤醒了ServiceManager。
- 与此同时,Binder驱动还反馈了一个BR_TRANSACTION_COMPLETE给surfaceflinger,告诉surfaceflinger它的addService请求已经发送成功;
- surfaceflinger在解析完BR_TRANSACTION_COMPLETE之后,就进入等待状态,等待ServiceManager的处理完请求之后反馈结果给它。