Android汇总总结Android IPC

Android IPC - Binder 学习总结

2016-01-20  本文已影响922人  王晨彦

转自Android IPC - Binder 学习总结

最近想学些Android Framework中的东西,必经之路就是binder,不夸张的说,binder是整个android架构 的基础。本文从Binder的基本概念和框架入手,讲述binder机制的点点滴滴。全文分为以下四部分:1、Android为何设计binder进行进程间通信。2、Binder的框架结构和概述。3、Client和Server通信过程。4、binder总结。

PS,本文绝大部分内容来自网络,是我自己学习binder的一篇总结,而且本文只是binder的入门,不涉及到过多底层的描述,要想更多了解binder的内容,还请移步到引用文献中老罗和邓凡平老师的文章。

Android IPC 为何设计Binder

Android 系统中,为了向应用开发者提供丰富多样的功能,这种通信方式更是无处不在,诸如媒体播放,音频视频捕获,通知,到各种让手机更智能的传感器(加速度,方位,温度,光亮度等)都由不同的Server负责管理,应用程序只需做为Client与这些Server建立连接便可以使用这些服务,花很少的时间和精力就能开发出令人眩目的功能。

设计Binder的原因主要有以下3个:

Binder总体概述

Binder框架及概述

四大角色

通讯模型

这四个角色的关系和互联网类似:Server是服务器,Client是客户终端,ServiceManager是域名服务器(DNS),Binder驱动是路由器。

(1)客户端通过某种方式得到服务器端的代理对象。代理对象和他的本地对象没有什么差别,它可以像其他本地对象一样调用其方法,访问其变量。
(2)客户端通过调用代理对象的方法向服务器端发送请求信息。
(3)代理对象通过binder设备节点(/dev/binder),把用户请求信息发送到Linux内核空间(内存共享),由Binder驱动获取并发送到服务进程。
(4)服务进程处理用户请求,并通过Linux内核的Binder驱动返回处理结果给客户端的代理对象。
(5)客户端收到服务端的返回结果。

四大角色的分工

从面向对象的角度,这个Binder对象现在有了两个引用:一个位于ServiceManager中,一个位于发起请求的Client中。如果接下来有更多的Client请求该Binder,系统中就会有更多的引用指向该Binder,就象java里一个对象存在多个引用一样。而且类似的这些指向Binder的引用是强类型,从而确保只要有引用Binder实体就不会被释放掉。

Client和Server的通讯过程

前戏

Server初始化(MediaService为例)

Server初始化的代码如下:

//获得一个ProcessState实例
sp proc(ProcessState::self());
//得到一个ServiceManager的代理对象
sp sm = defaultServiceManager();
//初始化MediaPlayerService服务,并向服务管家成功添加了这些服务。
MediaPlayerService::instantiate();
//启动Process的线程池,进入循环状态,以便接收来自客户端的请求
ProcessState::self()->startThreadPool();
//将IPCThreadState对象加入到刚才的线程池
IPCThreadState::self()->joinThreadPool();

作为Service进程,当他完成初始化工作之后,需要进入循环状态等待客户端的请求,Service进程调用它的IPCThreadState对象的joinThreadPool方法,开始轮询binder设备,等待客户端请求的到来。

MediaService通信

Binder总结

如果一个服务需要通过binder机制对外提供跨进程的接口,需要做下面这些事情。
(1)第一步,需要为这个接口定义一个继承自IInterface的接口类,假设叫做IMyService。
(2)第二步,需要定义两个binder类,一个是代理类BpMyService,继承BpInterface;另一个是实现类BnMyService,继承BnInterface。
(3)第三步,定义BnMyService的子类,这个子类可以是任何名字,比如就叫MyService,在其中真正实现接口所提供的各个函数。
(4)第四步,创建MyService的实例,注册到服务管理器,也可以在其它接口的函数中创建。

这篇基本是Binder机制的入门介绍,以后有机会详细研究一下Binder机制。

引用资料

  1. Android Bander设计与实现 - 设计篇
  2. Android深入浅出之Binder机制
  3. 老罗的Android之旅
  4. Android学习笔记–Binder
上一篇下一篇

猜你喜欢

热点阅读