美文网首页
Android IPC系列--Binder

Android IPC系列--Binder

作者: 涉川gw | 来源:发表于2018-07-02 20:09 被阅读0次

    简介

    什么是Binder?Android系统中,每个应用程序是由Activity,Service,Broadcast,ContentProvider中一个或多个组合而成,他们都有各自的进程,而如果要在这之间传递数据,就会涉及到进程间的通信。Binder是Android中用来实现进程间通信的手段。熟悉Linux系统的读者对进程间通信肯定不会陌生,Linux下的IPC机制有很多种,比如:传统的管道(Pipe)、信号(Signal)、跟踪(Trace)这些基础版本,他们只能实现父子进程或者兄弟进程之间的通信,后来又新增了三种“系统”级的通信机制,即:报文队列(Message)、共享内存(Share Memory)、信号量(Semaphore);再后来BSD Unix又对这些进行了拓展,我们众所周知的Socket就此出现。说了这么多,并没有看到本文的主角Binder?Android不是基于Linux发展来的吗?其实,是因为考虑到移动设备的性能和功耗内存你等特性,Android上自己设计了一种新的IPC方式,这个方式就是Binder。

    IPC流程

    IPC结构图.png

    从示意图中我们可以看出,每个Android的进程,都会分配有属于自己的用户空间,然后有一个属于系统的内核空间,默认是1G大小,这个内核空间的大小是可以通过参数配置进行调整的,具体怎么调有兴趣的可以自己Google了解一下。各个用户空间中的数据是独立的,相互间没办法直接互相访问,内核空间是共有的,每个进程都可以通过ioctl等方法来进行交互。

    Binder原理

    Binder流程.png
    注册服务

    由图可以看出,服务端和客户端是通过Server Manager建立连接的,Server首先会向Server Manager注册服务,ServiceManager向Binder驱动发送 BC_TRANSACTION 命令,Binder驱动收到命令后向ServerManager的tudo队列添加一条注册服务的事务来创建服务端进程binder_node并插入到binder_procs链表中,同事注册服务的线程进入等待状态。事务处理完后Binder会发送BR_TRANSACTION命令,ServiceManager收到命令后叫向svcinfo列表添加已经注册的服务进去,并将等待的线程唤醒,至此我们的服务端注册成功。

    获取服务

    获取服务的过程可以看成是注册过程的相反。首先ServiceManager向Binder驱动发送BC_TRANSACTION 命令,同时获取服务的线程进入等待状态;Binder驱动收到命令后向ServiceManger发送BC_TRANSACTION ,ServiceManager查询已注册服务列表,查询到即唤醒等待线程。

    开始通讯

    首先客户端通过ServiceManager获取到服务端的BinderProxy代理对象,通过代理对象将参数,方法表示传给ServiceManger,客户端线程进入等待状态。
    ServerManger将用户空间的请求数据复制到内核空间,并向服务端插入一条执行方法的事务,事务执行完后通知ServiceManger将执行结果从内核空间复制出来给到用户空间,将客户端线程唤醒,完成一次通讯。

    Binder原理

    上文已经介绍了服务端与客户端进程的整个通信过程了,虽然已经知道了整个过程,但是其中原理是什么我们还是一无所知的,所以这里我们来探索一下Binder跨进程通信的原理。首先我们从上面可以了解到,整个过程设计到四个部分,分别是Client端、Server端、ServerManger端还有内核驱动。整体结构图大概如下:


    Binder原理.png

    首先,Server需要向ServerManager注册服务,“登记”一些个人信息(方法属性什么的),ServerManager会记记录这些信息在自己的表中,然后服务端需要使用服务的时候就向ServerManger查询客户端需要哪个对象,由于进程隔离的存在,他们直接是不能直接进行数据交换的,这个时候驱动的作用就体现出来了。客户端经过驱动的手获取到了他想要的对象,但是事实上这个对象并不是服务端的存在的那个对象,它只是一个“山寨”的代理对象,它拥有服务端对象一模一样的“外观”,它能“欺骗”客户端,使客户端以为这个它想要的对象,然后就将自己的数据一五一十地交给了这个代理对象去处理,代理对象因为是“山寨”的,自己并没有那个能力去处理这些数据,只能返回给驱动,驱动根据服务表查询到服务端真正的对象后将数据交给这个对象去处理,并要求它将处理结果返回,得到处理的结果后,驱动再次将数据传递到客户端,至此,这个惊天“骗局”就完成了。
    从上面的分析可以看出,Binder的所谓的夸进程传输数据,并不是把一个对象传输到另一个进程,它只是传输了一个仿制品,仅有外观而无具体功能,客户端进程通过服务端进程的代理,在驱动的协助下完成了跨进程通信。

    相关文章

      网友评论

          本文标题:Android IPC系列--Binder

          本文链接:https://www.haomeiwen.com/subject/bgvtuftx.html