Android特有Binder与IPC机制原理初探,看完应该理解一些些。

原创 2016年10月19日 18:55:14

前言概述

Binder网上有很多文章要么讲的深入全是LInux内核指令C语言分析,要么空洞无脑。这里个人理解整理如下。

  • 什么是Binder:

1.Binder是一个类实现了IBinder接口,目的就是为了IPC服务而存在的。进程间通信的必须依赖的东西。

2.Binder是ServiceManager连接各种Manager(ActivityManager、WindowManager…….)和相应的系统底层ManagerService的桥梁。

3.Binder本意就是一个驱动程序,提供设备文件在Framework/dev/binder。

  • 什么是IPC(Inter-Process Communication)

1.IPC是跨进程(由于Andoird每个APP都至少是拥有一个进程)也可理解跨应用间通信,可以对比(Handler是线程间通信的桥梁).

2.Android每个应用都单独拥有一个Pid(进程ID),相互调用数据就需要IPC,但是Adroid OS 不允许我们直接像对象一样调用方法获取数据,所以我们需要Binder驱动IPC通信。

3.Binder的IPC与一般IPC的区别

我们都知道且最常用的Socket也是IPC通讯,通用的网络通讯方式,但是建立Socket连接销毁都有一定的开销;消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,数据传递至少有两次拷贝过程,所以对于移动应用效率不行,考虑IPC之间的安全问题,以及Binder支持1对多,Android OS就使用自己的驱动Binder来服务IPC;

理解IPC需要关注的几个点

  • ServiceManager
    系统服务和我们自定义服务可以存放的地点,内部HashMap(String, IBinder)存放Binder,通过这个类我们可以获取到系统提供的服务流程大概如此

  • 为什么通过Binder就能够跨进程了呢?
    首先我们的Android OS 进程数据共享图
    这里写图片描述
    IOCTL就是用户空间与内核交互数据的驱动函数。
    通过这一点我们就肯定知道Binder是肯定能够在内核空间与用户空间之间传递数据才能够实现我们需要IPC,下图也就是我们Binder干的事情;
    这里写图片描述
    这也使得我们实现Aidl来进行跨进程语言自定义类型的时候为什么要序列化对象,才能够实现IPC通信,因为底层并不认识JAVA对象,需要parcelable序列化后,实现writeToParcel与readFromParcel,来实现IPC通信。Parcel就是我们进程间数据保存的一个容器。,把数据写入到Parcel,Binder对其解析送到远程服务端,由远程服务端再次解析执行对应的函数,又通过Binder来返回到用户进程.

怎么使用系统服务呢?

//获取WindowManager服务引用
WindowManager wm = (WindowManager)getSystemService(getApplication().WINDOW_SERVICE);  //AudioService 》AudioManager 
// NotificationManagerService》 NotificationManager
//

其实JAVA中这部分的服务大部分都有一个供用户空间使用的manager类,这就是一个最正常的RPC调用,用户通过调用xxxManager的方法,实际上被Binder给迁移到系统服务进程中对应的SystemManagerService中对应的方法,并将结果再通过binder带回。

总结

本文只是对Binder机制的一些个人理解总结,并没有深入研究,
可参考老罗blog,有时间自己还是要从源码去深入理解下。
如何在最新版AS2.2版本下使用Aidl创建自定义类型的远程服务,见下篇Blog!

版权声明:欢迎你来转载,不过请带个此Blog链接!

使用 Binder IPC

转载:https://source.android.com/devices/architecture/hidl/binder-ipc?hl=zh-cn 本页介绍了 Android O 中对 Bi...
  • xixinliyan
  • xixinliyan
  • 2017年12月05日 22:56
  • 189

Android IPC机制(三):浅谈Binder的使用

从源码角度分析AIDL的工作原理
  • a553181867
  • a553181867
  • 2016年04月11日 20:19
  • 2291

Android进程间通信(IPC)机制Binder简要介绍和学习计划

在Android系统中,每一个应用程序都是由一些Activity和Service组成的,这些Activity和Service有可能运行在同一个进程中,也有可能运行在不同的进程中。那么,不在同一个进程的...
  • Luoshengyang
  • Luoshengyang
  • 2011年07月20日 02:36
  • 382279

Android Binder IPC详解-Android学习之旅(96)

linux内存空间与BInder DriverAndroid进程和linux进程一样,他们只运行在进程固有的虚拟空间中。一个4GB的虚拟地址空间,其中3GB是用户空间,1GB是内核空间 ,用户空间是非...
  • u010321471
  • u010321471
  • 2016年03月04日 15:41
  • 3332

Android Binder IPC分析

Binder IPC 机制是android非常重要的一种进程间通信机制,掌握了Binder IPC的原理,那么你基本上对Android有了50%的了解了。本文着重介绍了Binder的原理。...
  • windskier
  • windskier
  • 2011年04月12日 13:46
  • 16016

深入理解android之IPC机制与Binder框架

binder是Android系统进程间通信(IPC)方式之一。Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder具有无...
  • chaihuasong
  • chaihuasong
  • 2013年08月19日 15:11
  • 12052

Binder IPC 机制

________________________________________ http://www.angryredplanet.com/~hackbod/openbinder/docs/htm...
  • ccwwff
  • ccwwff
  • 2010年07月17日 18:19
  • 5354

Android的IPC机制Binder的各个部分

第一部分Binder的组成 1.1 驱动程序部分驱动程序的部分在以下的文件夹中: kernel/include/linux/binder.h kernel/drivers/android/binde...
  • xiongjiao0610
  • xiongjiao0610
  • 2015年04月26日 21:27
  • 226

Android开发艺术探索学习-IPC之Binder(二)

1.Binder死亡代理     这一节首先将介绍Binder类中比较重要的两个方法linkToDeath和unlinkToDeath。我们知道Binder是运行在服务进程,若服务端进程因为某种原因“...
  • chan1116
  • chan1116
  • 2015年11月19日 17:24
  • 1595

Android Binder机制浅析

摘要Binder是android中一个很重要且很复杂的概念,它在系统的整体运作中发挥着极其重要的作用,不过本文并不打算从深层次分析Binder机制,有两点原因:1是目前网上已经有2篇很好的文章了,2是...
  • singwhatiwanna
  • singwhatiwanna
  • 2014年02月23日 14:14
  • 19937
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android特有Binder与IPC机制原理初探,看完应该理解一些些。
举报原因:
原因补充:

(最多只允许输入30个字)