- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Android 系统的Binder 机制之一 (Service Manager)
Android 虽然构建在Linux 上面,但是在IPC (进程间)机制方面,没有利用Linux 提供IPC 机制,而是
自己实现了一套轻量级的IPC 机制 ——binder 机制。并且Android Binder 机制之上,Android 框架提供了一
套封装,可以实现对象代理(在本地进程中代理远程进程的对象)。本文简单分析一下Android Binder 机制。
Binder 情景分析
一个IPC 通讯我们可以理解成客户端-服务器模式,因此我们先在这里分析一下典型的Binder 应用模式:
1. 客户端通过某种方式(后文会详细介绍)得到服务器端的代理对象。从客户端角度看来代理对象和他
的本地对象没有什么差别。它可以像其他本地对象一样调用其方法,访问其变量。
2. 客户端通过调用服务器代理对象的方法向服务器端发送请求。
3. 代理对象把用户请求通过Android 内核 (Linux 内核)的Binder 驱动发送到服务器进程。
4. 服务器进程处理用户请求,并通过Android 内核(Linux 内核)的Binder 驱动返回处理结果给客户端的
服务器代理对象。
5. 客户端收到服务器端的返回结果。
如果你对COM 或者Corba 熟悉的话,以上的情景是否会让你联想到什么呢?没错!都是对象代理。以
上的情景,在Android 中经常会被用到。如果你还没有注意到这点儿,那么本文非常适合你。
Binder 机制的组成
1、Binder 驱动
binder 是内核中的一个字符驱动设备位于:/dev/binder。这个设备是Android 系统IPC 的核心部分,客
户端的服务代理用来通过它向服务器(server )发送请求,服务器也是通过它把处理结果返回给客户端的服
务代理对象。我们只需要知道它的功能就可以了,本文我们的重点不在这里,所以后面不会专门介绍这部
分,因为很少会有人会显示打开这个设备去开发Android 程序。如果想深入了解的话,请研究内核源码中的
binder.c。
2、Service Manager
负责管理服务。对应于第一步中,客户端需要向Service Manager 来查询和获得所需要服务。服务器也
需要向Service Manager 注册自己提供的服务。可以看出Service Manager 是服务的大管家。
3、服务(Server )
需要强调的是这里服务是指的是System Server ,而不是SDK server ,请参考《高焕堂——Android 框架底
层结构知多少?》关于两种Server 的介绍(其实应该是三种,丢掉了init 调用的server ,在init.rc 中配置)。
4、客户端
一般是指Android 系统上面的应用程序。它可以请求Server 中的服务。
5、对象代理
是指在客户端应用程序中生成的Server 代理(proxy)。从应用程序角度看代理对象和本地对象没有差别,
都可以调用其方法,方法都是同步的,并且返回相应的结果。
大内总管——Service Manager
Android 系统Binder 机制的总管是Service Manager ,所有的Server (System Server )都需要向他注册,
应用程序需要向其查询相应的服务。可见其作用是多么的重要,所以本文首先介绍Service Manager 。
通过上面介绍我们知道Service Manager 非常重要,责任重大。那么怎样才能成为Service Manager 呢?
是不是谁都可以成为Service Manager 呢?怎样处理server 的注册和应用程序的查询和获取服务呢?为了回
答这些问题先查看,Android 中Service Manager 的源码,其源码位于:
frameworks\base\cmds\servicemanager\service_manager.c
我们发现了main 函数,说明他自己就是一个进程,在init.rc 中我们发现:
service servicemanager /system/bin/servicemanager
user system
critical
onrestart restart zygote
onrestart rest
文档评论(0)