Binder 分析

从 MediaService入手


1 首先创建一个ProcessState对象 打开一个binder设备fd 映射一块共享内存

2 获取 IServerManager 业务对象 包括如下操作

    (1)创建BpBinder对象 设置handle对象为0(handle值是找到对端的凭证)

     (2) 创建一个BpServerManager对象,该对象定义了ServerManager业务接口,并且持有一个成员变量 mRemote为刚才创建的BpBinder对象


3 通信: 创建一个IPCThreadState对象 该对象是线程绑定的,其中包含发送缓冲对象和接受缓冲对象,要想和对端通信(也就是和BpBinder对应的handle的BnBinder通信)调用BpServerManager的业务接口,转而调用BpBinder的transact方法,转而调用该线程绑定的IPCThreadState函数,并传递handle进行向对端发送数据(向共享内存中写数据) 收到对方返回数据 每个线程总都有一个发送缓冲区和接收缓冲区,所以是线程安全的,具体Binder设备如何保证多个线程的安全,这个需要研究Binder驱动(类似将共享内存的同步逻辑封装到驱动中,而不是通信进程自行解决)


4 IServiceManager 所调用的所有接口都是向远端发送Binder数据



服务端ServiceManager  代码很简单,就是打开Binder设备得到fd,映射内存,死循环 阻塞等待对端请求到来,处理请求,写会结果


服务端代码

BnBinder 有个onTransact函数 客户端BBService 继承BnBinder 和IService接口,当调用onTransact的时候会根据请求码选择调用IService的具体方法,然后把执行结果返回给对端


可见 Binder 通信是由 handler控制的 没有服务端也是可以互相通信的 是无连接的 ServerManager起到连接作用





你可能感兴趣的:(Binder 分析)