Android------Binder 开始篇

题记:

最近工作上不太忙,就抽空研究了一段时间的binder,有了一点点小小的心得,这里把它整理了一下,记录了下来。(源码是android7.1)


参考资料:

《深入解析Android5.0系统》;《Android开发艺术探索》;《深入理解Android卷1》;《深入理解Android卷3》;红茶一杯话binder------点击打开链接;gityuan的binder系列------点击打开链接;罗升阳的binder系列------点击打开链接;Andriod Binder机制(超级详尽)------点击打开链接;Android深入浅出之binder机制------点击打开链接;理解Android的binder机制-----点击打开链接;轻松理解Androidbinder------点击打开链接;binder service入门------点击打开链接

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

还有一些零散的资料,这里就不列出来了,其中只有任玉刚的Android开发艺术探索讲的都是java层的概念,这里建议做app开发的朋友可以去研读一番,个人认为写的还是不错的。其他大神写的文章基本都是java+native+kernel的形式,很多情况下都是看的云里雾里,但还是要研究下去,这里要说明一下,本人是做系统上层开发的,对驱动和硬件不太熟悉,这里就不专门写binder驱动的东西了,驱动的内容我会穿插在这几篇博客里面,以后如果研究了驱动,可以再补上。我这里的研究大部分只限于java+native层,驱动的东西会分析很少,自己的水平也有限,不可能把每个知识点都说的很清楚,但即便如此,我也是站在巨人的肩膀上去看世界,说的不对的地方,请大家不吝赐教,我将万分感激。废话不多说了,开始正式的研究。

PS:文章里的图片都是资料里现有的,我觉得画的都非常好,加上本人不善于画图,这里就拿过来直接用了。


正文:

我们都知道Android系统是一个非常优秀的开放系统,如果你做系统开发,特别是要对frameworks有所理解,那么必须要对binder框架有所涉猎,android一直都想模糊进程的概念,所以就使用了binder来将整个android系统粘贴在了一起,binder英文意思是粘合剂的意思,它所起到的作用也证明了这点。进程间通讯机制有很多种,管道,信号量,socket等等,关于android为什么要选择binder进行进程间通讯,你可以去知乎上看看大神们都怎么说,其实你只需要知道binder的前身是open binder,binder的设计者现在就在google工作,binder是在设计上和效率上是如今最好的一种IPC方式。

Binder框架的四个主要成员:server,client,servicemanager,binder驱动

其中前三个是运行在用户空间的,binder驱动是运行在内核空间,用一张图表示如下:


上面这张图是老罗的,相信很多人都看到过,该图有一点还可以完善下,就是server和client与servicemanager的交互过程,一个是addservice,另一个是getservice

通过该图我们可以知道:

首先,server进程会注册service到servicemanager,然后client进程会从servicemanager来获取服务,最后client进程就可以通过binder框架和server通信了。这里需要注意的是这一系列的操作都是基于binder驱动来进行的,而client,server,servicemanager与binder驱动通信都是通过ioctl


这里我百度了一下ioctl函数:

ioctl是设备驱动程序中对设备的I/O通道进行管理的函数,int ioctl(int fd, ind cmd, …),其中fd是用户程序打开设备时使用open函数返回的文件标示符,cmd是用户程序对设备的控制命令。ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数来控制设备的I/O通道。在驱动程序中实现的ioctl函数体内,实际上是有一个switch{case}结构,每一个case对应一个命令码,做出一些相应的操作。怎么实现这些操作,这是每一个程序员自己的事情



这里再给一张图,该图是gityuan的;

java_binder


该图很好的诠释了binder的架构,最上面的framework层是java层的,client和server也是java层的(client和server也可以直接在c++层实现,这样其实效率更高),binder实体对应的是服务端server,binderProxy引用对象对应的是客户端client。java层的binder框架是建立在native层的binder框架上的,所以要用到JNI对应到native层,让native层去处理,native层不管是,BBinder,BpBinder,还是ServiceManager,它们之间的交互都离不开Binder核心——Binder驱动。

在java层次,如果客户端和服务端是在同一个进程中的,IBinder对象其实指的是BInder,如果客户端和服务端是在不同的进程,IBinder对象其实指的是BInderProxy。相对应的,在native层,如果双方是在同一进程,IBinder其实是BInder实体(BBinder),不同进程就指的是Binder引用对象了(BpBinder),在很多场合,不需要刻意的去区分实体对象和引用对象,这时可以使用“IBinder”对象来统一称呼它们。



下面我把binder架构所涉及的目录列举出来

frameworks/base/core/java   (java)

frameworks/base/core/jni   (jni)

frameworks/native/libs/binder   (native)

frameworks/native/cmds/binder   (native)

kernel/drivers/staging/android   (kernel)


文章索引如下:

1.   Binder 开始篇------点击打开链接

2.   BInder servicemanager篇------点击打开链接

3.   BInder native层架构分析------点击打开链接

4.   Binder java层浅析------点击打开链接

5.   Binder java层如何和native层通信------点击打开链接

6.   Binder 实例分析------点击打开链接

7.   Binder 如何在binder架构下写service------点击打开链接


PS:该系列文章我会不断完善,因为里面很多地方都不详细,而且错误也是难免的。


你可能感兴趣的:(android,Binder)