[IT计算机]androidbinder机制

  • 格式:pdf
  • 大小:1.89 MB
  • 文档页数:330

Android进程间通信-Binder机制

目 录

一.简要介绍和学习计划

二.Service Manager成为Binder守护进程之路

三.Server和Client获得Service Manager接口之路

四.Server启动过程源代码分析

五.Client获得Server远程接口过程源代码分析

六.应用程序框架层的Java接口源代码分析

一、Android进程间通信(IPC)机制Binder

简要介绍和学习计划

我们知道,在Android系统中,每一个应用程序都是由一些Activity和Service组成的,一般Service

运行在独立的进程中,而 不同的Activity有可能运行在同一个进程中,也可能运行在不同的进程中。

这很自然地想到,不在同一个进程的Activity和Service是如何 通信的呢?毕竟它们要协作在一起

来完成一个完整的应用程序功能。这就是本文中要介绍的Android系统进程间通信机制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机制一文从情景出发,深入地介绍了Binder在用户空间的三个组件

Client、Server和Service Manager的相互关系,Android Binder设计与实现一文则是详细地介绍

了内核空间的Binder驱动程序的数据结构和设计原理。非常感谢这两位作者给我们带来这么好的

Binder学 习资料。总结一下,Android系统Binder机制中的四个组件Client、Server、Service

Manager和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接口源代码分析。 二、浅谈Service Manager成为Android进

程间通信(IPC)机制Binder守护进程之路

上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学习计划简 要介绍了Android系统

进程间通信机制Binder的总体架构,它由Client、Server、Service Manager和驱动程序Binder四

个组件构成。本文着重介绍组件Service Manager,它是整个Binder机制的守护进程,用来管理开

发者创建的各种Server,并且向Client提供查询Server远程接口的功能。 既然Service Manager

组件是用来管理Server并且向Client提供查询Server远程接口的功能,那么,Service Manager

就必然要和Server以及Client进行通信了。我们知道,Service Manger、Client和Server三者分

别是运行在独立的进程当中,这样它们之间的通信也属于进程间通信了,而且也是采用Binder机制

进行进 程间通信,因此,Service Manager在充当Binder机制的守护进程的角色的同时,也在充当

Server的角色,然而,它是一种特殊的Server,下面我们将会看到它的特 殊之处。 与Service Manager

相关的源代码较多,这里不会完整去分析每一行代码,主要是带着Service Manager是如何成为整个

Binder机制中的守护进程这条主线来一步一步地深入分析相关源代码,包括从用户空间到内核空间

的相关源代码。希望读者在 阅读下面的内容之前,先阅读一下前一篇文章Android进程间通信(IPC)

机制Binder简要介绍和学习计划 Service Manager在用户空间的源代码位于

frameworks/base/cmds/servicemanager目录下,主要是由binder.h、 binder.c和

service_manager.c三个文件组成。Service Manager的入口位于service_manager.c文件中的main

函数:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

int main(int argc, char **argv)

{

struct binder_state *bs;

void *svcmgr = BINDER_SERVICE_MANAGER;

bs = binder_open(128*1024);

if (binder_become_context_manager(bs)) {

LOGE("cannot become context manager (%s)\n", strerror(errno));

return -1;

}

svcmgr_handle = svcmgr;

binder_loop(bs, svcmgr_handler);