Android开发之Binder机制详解(图)

  次阅读 作者:智能小宝 来源:互联网 2016-01-14 09:18 我要评论(0)

Android平台的一个基本设计理念是构造一个相对平坦的功能集合,这些功能可能会身处于不同的进程中,然而却可以高效地整合到一起,实现不同的 用户需求。这就必须打破过去各个孤立App所形成的天然藩篱。为此,Android提供了Binder机制。

在Android中,系统提供的服务被包装成一个个系统级service,这些service往往会在设备启动之时添加进Android系统。在上一篇文 档中,我们已经了解了BpBinder和BBinder的概念,而service实体的底层说到底就是一个BBinder实体。

我们知道,如果某个程序希望享受系统提供的服务,它就必须调用系统提供的外部接口,向系统发出相应的请求。因此,Android中的程序必须先拿到和某个 系统service对应的代理接口,然后才能通过这个接口,享受系统提供的服务。说白了就是我们得先拿到一个和目标service对应的合法 BpBinder。

然而,该怎么获取和系统service对应的代理接口呢?Android是这样设计的:先启动一个特殊的系统服务,叫作Service Manager Service(简称SMS),它的基本任务就是管理其他系统服务。其他系统服务在系统启动之时,就会向SMS注册自己,于是SMS先记录下与那个 service对应的名字和句柄值。有了句柄值就可以用来创建合法的BpBinder了。只不过在实际的代码中,SMS并没有用句柄值创建出 BpBinder,这个其实没什么,反正指代目标service实体的目的已经达到了。后续当某程序需要享受某系统服务时,它必须先以 特定手法 获取SMS代理接口,并经由这个接口查询出目标service对应的合法 Binder句柄,然后再创建出合法的BpBinder对象。

在此,我们有必要交代一下 Binder句柄 的作用。句柄说穿了是个简单的整数值,用来告诉Binder驱动我们想找的目标Binder实体是哪个。但 是请注意,句柄只对发起端进程和Binder驱动有意义,A进程的句柄直接拿到B进程,是没什么意义的。也就是说,不同进程中指代相同Binder实体的 句柄值可能是不同的。示意图如下:

SMS记录了所有系统service所对应的Binder句柄,它的核心功能就是维护好这些句柄值。后续,当用户进程需要获取某个系统service的代 理时,SMS就会在内部按service名查找到合适的句柄值,并 逻辑上 传递给用户进程,于是用户进程会得到一个新的合法句柄值,这个新句柄值可能在 数值上和SMS所记录的句柄值不同,然而,它们指代的却是同一个Service实体。句柄的合法性是由Binder驱动保证的,这一点我们不必担心。

前文我们提到要以 特定手法 获取SMS代理接口,这是什么意思呢?在IServiceManager.cpp文件中,我们可以看到一个 defaultServiceManager()函数,代码如下:

【frameworks/native/libs/binder /IServiceManager.cpp】

sp<IServiceManager> defaultServiceManager()

{

if (gDefaultServiceManager != NULL)

return gDefaultServiceManager;

{

AutoMutex _l(gDefaultServiceManagerLock);

if (gDefaultServiceManager == NULL)

{

gDefaultServiceManager = interface_cast<IServiceManager>(

ProcessState::self()->getContextObject(NULL));

}

}

return gDefaultServiceManager;

}

这个函数里调用interface_cast的地方是用一句 getContextObject(NULL)来获取BpBinder对象的。我们先不深入讲解这个函数,只需要知道这一句里的 getContextObject(NULL)实际上相当于new BpBinder(0)就可以了。噢,看来要得到BpBinder对象并不复杂嘛,直接new就好了。然而,我之所以使用 特定手法 一词,是因为这种直 接new BpBinder(xxx)的做法,只能用于获取SMS的代理接口。大家可不要想当然地随便用这种方法去创建其他服务的代理接口噢。

在Android里,对于Service Manager Service这个特殊的服务而言,其对应的代理端的句柄值已经预先定死为0了,所以我们直接new BpBinder(0)拿到的就是个合法的BpBinder,其对端为 Service Manager Service实体 (至少目前可以先这么理解)。那么对于其他 服务实体 对应的代理,句柄值又是多少呢?使用方又该如何得到这个句柄值呢?我们总不能 随便蒙一个句柄值吧。正如我们前文所述,要得到某个服务对应的BpBinder,主要得借助Service Manager Service系统服务,查询出一个合法的Binder句柄,并进而创建出合法的BpBinder。

这里有必要澄清一下,利用SMS获取合法BpBinder的方法,并不是Android中得到BpBinder的唯一方法。另一种方法是, 起始端 经由 一个已有的合法BpBinder,将某个binder实体或代理对象作为跨进程调用的参数, 传递 给 目标端 ,这样目标端也可以拿到一个合法的 BpBinder。

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...