Android的IPC通信方式

415 阅读3分钟

android源码分析目录

一 概述

IPC全称是Inter-Process Communication跨进程通信,因为Android系统是基于Linux内核,所以对于Android的IPC方式,除了我们最常听说的Binder之外,一些Linux的通信方式也是可以使用的

二 Android中的IPC通信方式

Android中的IPC方式有

  • 管道Pipe
  • Socket
  • 共享内存
  • 信号
  • Binder(Android特有的)

除了Binder是Android特有的之外,其他几种通信方式都是Linux的,那么这些IPC通信方式之间又有什么区别呢,或者说,在选择IPC方式的时候,应该如何取舍呢

三 不同IPC的区别

管道Pipe

  • 管道是Linux是一种IPC方式,在Android中也可以使用,
  • 它是将进程A中的数据写到内核,然后在进程B中从内核中读出数据,因为它存在一个读和写的过程,所以它有两次文件拷贝
  • 不论是对于读,还是写,都需要一个fd,并且它是半双工的,对于IPC的通信来说,一般一个fd写,一个fd读。
  • 分为无名管道和有名管道
  • 对于管道这种IPC方式,一遍用于父子进程

Socket

  • socket也是一种IPC的方式,它是基于C/S架构
  • 它也有两次拷贝

共享内存

  • 两个进程可以访问同一块内存
  • 可以直接读写,不需要拷贝
  • 需要同步机制

信号

  • 信号是一个比较特殊的IPC通信方式
  • 它只能单向发送,但是可以一对多发
  • 发信号时不能带参数

四 Binder

介绍完几种IPC方式,再来说说Android特有的Binder,既然已经有了那么多IPC方式,为什么还需要Binder呢?或者说Binder比起其他的IPC方式来说,要好在什么地方呢

  • 首先是效率,上述的其他IPC方式中,大多数需要2次拷贝,而Binder只需要一次拷贝,从读写效率上来说,Binder更高
  • 然后是安全,在Android中会有不同进程的通信,很多时候是哪个进程和我们通信,我们自己是没有办法知道的,或者说相关的通信信息是否可靠,是否安全我们也是不能确定的,而Binder则没有这个问题,它从驱动层面为我们解决了这个事情
  • 最后是使用上,共享内存的效率不必Binder差,但是它在使用时需要处理各种同步的问题,而Binder不论是Java层,还是native层,我们使用上都非常方便,这也是Android选择BInder的一个原因

五 总结

说了这么多Binder的优势,但是在Android系统中,并不是所有的IPC通信方式都使用的Binder,那这又是基于什么考虑呢?

  • 首先,Binder的优势是读写效率高,那么如果我们如果不需要传递太多数据,也可以选择其他的IPC方式
  • 其次,BInder是基于多线程的,它有一个Binder线程,所以在一些单线程的情况下,我们也不能使用BInder
  • 最后,BInder是一个比较重量级的IPC方式,很多时候我们一些很简单的IPC场景根本用不上Binder,毕竟杀鸡焉用牛刀