欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android进程间通信(IPC)机制Binder简要介绍

程序员文章站 2024-03-06 20:20:26
        在android系统中,每一个应用程序都是由一些activity和service组成的...

        在android系统中,每一个应用程序都是由一些activity和service组成的,这些activity和service有可能运行在同一个进程中,也有可能运行在不同的进程中。那么,不在同一个进程的activity或者service是如何通信的呢?这就是本文中要介绍的binder进程间通信机制了。

        我们知道,android系统是基于linux内核的,而linux内核继承和兼容了丰富的unix系统进程间通信(ipc)机制。有传统的管道(pipe)、信号(signal)和跟踪(trace),这三项通信手段只能用于父进程与子进程之间,或者兄弟进程之间;后来又增加了命令管道(named pipe),使得进程间通信不再局限于父子进程或者兄弟进程之间;为了更好地支持商业应用中的事务处理,在at&t的unix系统v中,又增加了三种称为“system v ipc”的进程间通信机制,分别是报文队列(message)、共享内存(share memory)和信号量(semaphore);后来bsd unix对“system v ipc”机制进行了重要的扩充,提供了一种称为插口(socket)的进程间通信机制。若想进一步详细了解这些进程间通信机制,建议参考android学习启动篇一文中提到《linux内核源代码情景分析》一书。

        但是,android系统没有采用上述提到的各种进程间通信机制,而是采用binder机制,难道是因为考虑到了移动设备硬件性能较差、内存较低的特点?不得而知。binder其实也不是android提出来的一套新的进程间通信机制,它是基于openbinder来实现的。openbinder最先是由be inc.开发的,接着palm inc.也跟着使用。现在openbinder的作者dianne hackborn就是在google工作,负责android平台的开发工作。

        前面一再提到,binder是一种进程间通信机制,它是一种类似于com和corba分布式组件架构,通俗一点,其实是提供远程过程调用(rpc)功能。从英文字面上意思看,binder具有粘结剂的意思,那么它把什么东西粘结在一起呢?在android系统的binder机制中,由一系统组件组成,分别是client、server、service manager和binder驱动程序,其中client、server和service manager运行在用户空间,binder驱动程序运行内核空间。binder就是一种把这四个组件粘合在一起的粘结剂了,其中,核心组件便是binder驱动程序了,service manager提供了辅助管理的功能,client和server正是在binder驱动和service manager提供的基础设施上,进行client-server之间的通信。service manager和binder驱动已经在android平台中实现好,开发者只要按照规范实现自己的client和server组件就可以了。说起来简单,做起难,对初学者来说,android系统的binder机制是最难理解的了,而binder机制无论从系统开发还是应用开发的角度来看,都是android系统中最重要的组成,因此,很有必要深入了解binder的工作方式。要深入了解binder的工作方式,最好的方式莫过于是阅读binder相关的源代码了,linux的鼻祖linus torvalds曾经曰过一句名言rtfsc:read the fucking source code。

        虽说阅读binder的源代码是学习binder机制的最好的方式,但是也绝不能打无准备之仗,因为binder的相关源代码是比较枯燥无味而且比较难以理解的,如果能够辅予一些理论知识,那就更好了。闲话少说,网上关于binder机制的资料还是不少的,这里就不想再详细写一遍了,强烈推荐下面两篇文章:

       android深入浅出之binder机制

        android binder设计与实现 – 设计篇

        android深入浅出之binder机制一文从情景出发,深入地介绍了binder在用户空间的三个组件client、server和service manager的相互关系,android binder设计与实现一文则是详细地介绍了内核空间的binder驱动程序的数据结构和设计原理。非常感谢这两位作者给我们带来这么好的binder学习资料。总结一下,android系统binder机制中的四个组件client、server、service manager和binder驱动程序的关系如下图所示:

        Android进程间通信(IPC)机制Binder简要介绍

        1. client、server和service manager实现在用户空间中,binder驱动程序实现在内核空间中

        2. binder驱动程序和service manager在android平台中已经实现,开发者只需要在用户空间实现自己的client和server

        3. binder驱动程序提供设备文件/dev/binder与用户空间交互,client、server和service manager通过open和ioctl文件操作函数与binder驱动程序进行通信

        4. client和server之间的进程间通信通过binder驱动程序间接实现

        5. service manager是一个守护进程,用来管理server,并向client提供查询server接口的能力

        至此,对binder机制总算是有了一个感性的认识,但仍然感到不能很好地从上到下贯穿整个ipc通信过程,于是,打算通过下面四个情景来分析binder源代码,以进一步理解binder机制:

       1. service manager是如何成为一个守护进程的?即service manager是如何告知binder驱动程序它是binder机制的上下文管理者。

        2. server和client是如何获得service manager接口的?即defaultservicemanager接口是如何实现的。

        3. server是如何把自己的服务启动起来的?service manager在server启动的过程中是如何为server提供服务的?即iservicemanager::addservice接口是如何实现的。

        4  service manager是如何为client提供服务的?即iservicemanager::getservice接口是如何实现的。

        在接下来的四篇文章中,将按照这四个情景来分析binder源代码,都将会涉及到用户空间到内核空间的binder相关源代码。这里为什么没有client和server是如何进行进程间通信的情景呢? 这是因为service manager在作为守护进程的同时,它也充当server角色。因此,只要我们能够理解第三和第四个情景,也就理解了binder机制中client和server是如何通过binder驱动程序进行进程间通信的了。

        为了方便描述android系统进程间通信binder机制的原理和实现,在接下来的四篇文章中,我们都是基于c/c++语言来介绍binder机制的实现的,但是,我们在android系统开发应用程序时,都是基于java语言的,因此,我们会在最后一篇文章中,详细介绍android系统进程间通信binder机制在应用程序框架层的java接口实现:

       5. android系统进程间通信binder机制在应用程序框架层的java接口源代码分析。

         以上就是关于binder 机制的简单介绍,后续继续整理相关资料,谢谢大家对本站的支持!