Android_FrameWork之Native_Binder

Binder是Android系统提供的一种IPC(进程间通信)机制,除Binder还有Pipe和socket等。

这片文章主要分析Android系统中的Binder机制,Binder机制有4个组件构成,它们分别是:Client,Server,ServiceManager和驱动Binder。

在Android基于Binder的C/S架构中,Binder就好比大世界中的网络,在这个体系中,除C/S(client/server)端外,还有一个全局的ServiceManager来管理系统中的各种Server。

Client、Server和ServiceManager三者之间的交互关系:

01

MediaServer解析

一个Server进程可注册多个Service

Server注册对应Service到ServicManager中,Client要使用某个Service,必须到ServiceManager中获得Service信息,Client根据获取的Service信息建立与Service所在的Server进程的通讯,然后开始和Service直接交互,其中相互访问的两个对象之间都为C/S架构,Android中三者交互基于Binder通信

用MediaServer为例辅助,进行Binder的解析

具体实现细节,可根据下面类图进行跟代码查看

Main_MediaServer.cpp为MediaServer的入口,其main()方法中主要做了5个操作,类图中已标示代码查看路线

  • 获得一个ProcessState实例
  • MS作为ServiceManager的客户端,需要向ServiceManger注册服务,调用defaultServiceManager,得到一个IServiceManager。
  • 多媒体系统的MediaPlayer服务,我们将以它作为主切入点
  • 创建一个线程池。
  • 将自己加入到刚才的线程池中

02

下图为binder通信层和业务层的关系图

03

ServiceManager 之 Binder的守护进程

ServiceManager组件是用来管理Server并且向Client提供查询Server远程接口的功能。

Android系统中的Service信息都是先添加到ServiceManager中,由ServiceManager来集中管理,这样就可以随时查询当前系统中启动的Service信息,想要和Service进行交互,必须先向ServiceManager来获取该Service的信息,然后使用获取的信息去和Service交互。

下面以Android7.0版本源代码进行分析

源码位置:\frameworks\native\cmds\servicemanager\

主要代码:binder.c,binder.h,service_manager.c