Binder:SurfaceFlinger注册服务

308 阅读1分钟

以SurfaceFlinger为例,看下SF是怎么注册到ServiceManager中的

surfaceflinger注册.jpg 如上图所示,surfaceflinger注册的主要流程如下:

  1. setThreadPoolMaxThreadCount(4)设置线程池最大容量
  2. ProcessState::self()打开binder设备,设置当前进程fd支持的最大binder线程池容量, mmap将文件内容映射成一个内存页,用户空间的虚拟内存地址与文件进行映射(绑定).
  3. startThreadPool开启线程池
  4. defaultServiceManager获取本地代理BpServiceManager
  5. 然后依次调用BpServiceManager.addService-->BpBinder.transact-->IPCThreadState.transact
  6. 在IPCThreadState.transact对请求的数据进行打包,然后通过ioctl与已经打开的binder设备驱动进行通信

总结:

  1. surfaceflinger发送一个BC_TRANSACTION事务给Binder驱动。
  2. Binder驱动收到该事务之后,对请求数据进行解析,在Kernel中新建了surfaceflinger对应的Binder实体,并将在ServiceManager的进程上下文中添加了该Binder实体的Binder引用。
  3. 解析完数据之后,新增一个待处理事务并提交到ServiceManager的待处理事务列表中;接着,就唤醒了ServiceManager。
  4. 与此同时,Binder驱动还反馈了一个BR_TRANSACTION_COMPLETE给surfaceflinger,告诉surfaceflinger它的addService请求已经发送成功;
  5. surfaceflinger在解析完BR_TRANSACTION_COMPLETE之后,就进入等待状态,等待ServiceManager的处理完请求之后反馈结果给它。