深入理解 Android 的 IPC 机制--------Binder

来源:互联网 发布:excel编程软件 编辑:程序博客网 时间:2024/05/17 02:51

           在android中,,应用程序虽然是以独立的进程来运行的,但相互之间还是需要通信。。比如,,我们的应用程序 和后台服务往往会运行不同的进程当中,,各自有这独立内存地址空间,,,但是又要彼此互相合作,,,需要进行通信和数据共享,,在linux下,进程通信的方式有  socket,,named pipe命名管道,,signal  信号,,message  queue  消息队列,,share memory 共享内存等。。

           但是android 选择了Binder,,,是因为他更加简洁和快速,,消耗的内存更小,,而且因为传统的进程通信可能会增加进程的开销,,而且有进程过载和安全漏洞,,,Binder正好能避免这类问题。。。他提供的功能有:

用驱动程序来推进进程间的通信。。

通过共享内存来提高性能。。

为进程请求分配每个进程的线程池。。

针对系统中的对象引入了引用计数和跨进程的对象引用映射。。

进程间同步调用。。。

Binder 是通过 linux的binder driver 来实现的,两个进程间通信看起来就像是一个进程进入另一个进程去执行代码,,,然后带着执行结果返回。。。这个操作类似于线程迁移,,java中的代码迁移。。。

Binder通信是同步而不是异步的,,,Android系统的运行都将依赖于Binder驱动。。。

Binder 通信也是基于 我们的service端和客户端得,,,所有需要进行通信的进程都必须实现Ibinder接口。。。系统中有一个 service manager 后台线程管理着所有service,,,它监听这所有程序是否向它发送请求,,,。。

在android虚拟机启动之前,,,他会先启动service manager 进程,,然后会打开Binder driver,通知Binder kernel驱动程序它要作为System service manager,,然后开始一个循环等待处理其他进程的数据。。

 

           为了完成进程间通信,Binder采用了AIDL(android interface definition language)来描述进程间的接口。。

Binder不仅是Android系统中的一个完善的IPC机制,,它也可以被当做Android系统的一种RPC机制,,remote process connection  ,,因为Binder 的功能就是在本地执行其他进程的功能。。在某个进程通过Binder获取要调用的进程服务时,,可以是一个本地调用,也可以是一个远程的服务。

          Binder的实质就是要把对象从一个进程映射到另一个进程当中,不管这个对象是本地的还是远程的。如果是远程对象,就是将远程对象的引用从一个进程映射到另一个进程,当使用这个远程对象时,可以说就是在使用远程对象再本地内存的一个引用,,相当于把它当做一个本地对象来使用。。。而最终调用进程不会关心这个对象是否是本地对象,或是远程对象,,都会被当做本地对象来处理。。。。这里本地对象和远程对象的引用所表示的和他们之间的不同之处也就是,本地对象表示本地进程地址空间里的一个地址,而远程对象的引用则是一个32位的句柄。

 

          在android中,,我们的activity组件要与service组件进行通信,就需要使用到Binder机制,我们可以把activity看做一个客户端,把service看做一个服务端,也就是一个客户端于服务端的通信,。。。android的binder机制就是一个C/S架构,客户端和服务端直接通过Binder交互数据,打开Binder写入数据,通过Binder读取数据,这样就完成通讯,,数据的读写是由Binder driver来完成的。。。。除了driver外,还包括以下组成部分:

1,service Manager 负责管理android系统中的所有服务(android是如何初始化service manager 详情可见我的上一篇博客),当客户端要去服务端进行通信时,就会通过它来查询和取得要交互的service。。

2,server,,服务端,也就是service manager查询出来的service。。

3,客户端,,请求service中的服务,也就是当做是activity。。。

4,服务代理,,就是客户端应用中生成的server代理,,也就是AIDL生成文件中的stub(service proxy),,他包含service的所提供服务的所有方法,所以在应用程序端看来他和service没有区别。。。.