Android系统Service Binder机制 系统服务

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

前面我们已经介绍了Android Binder机制的Service Manager,Service对象代理1,Service对象代理2。本文将介绍一下Android机制的另外一个重要部分系统Service。

1、系统Service实例Media server

首先我们先看一下Android一个实例Media Service,代码位于framework/base/media/mediaserver/main_mediaserver.cpp文件:

1: // System headers required for setgroups, etc.

2: #include <sys/types.h>

3: #include <unistd.h>

4: #include <grp.h>

5:

6: #include <binder/IPCThreadState.h>

7: #include <binder/ProcessState.h>

8: #include <binder/IServiceManager.h>

9: #include <utils/Log.h>

10:

11: #include <AudioFlinger.h>

12: #include <CameraService.h>

13: #include <MediaPlayerService.h>

14: #include <AudioPolicyService.h>

15: #include <private/android_filesystem_config.h>

16:

17: using namespace android;

18:

19: int main(int argc, char** argv)

20: {

21:sp<ProcessState> proc(ProcessState::self());

22:sp<IServiceManager> sm = defaultServiceManager();

23:LOGI("ServiceManager: %p", sm.get());

24:AudioFlinger::instantiate();

25:MediaPlayerService::instantiate();

26:CameraService::instantiate();

27:AudioPolicyService::instantiate();

28:ProcessState::self()->startThreadPool();

29:IPCThreadState::self()->joinThreadPool();

30: }

我们发现Media Server是一个进程,并且该程序的实现表面上也挺简单,其实并不简单,让我们慢慢分析一下Media Server。

1、第一句创建创建一个ProcessState的引用,但是这个对象后面并没有被调用到,那么为什么创建呢?请回想一下我在博文《Android系统的Binder机制之二服务代理对象(1)》中介绍ProcessState对象时提到:如果一个进程要使用Binder机制,那么他的进程中必须要创建一个ProcessState对象来负责管理Service的代理对象。

2、第二句调用defaultServiceManager获得一个Service Manager代理对象,我在《Android系统的Binder机制之二服务代理对象(1)》已经对此有了详细的介绍这里就不赘述了。

3、后面几行都是创建具体的Service,我们展开之后发现都是一些调用Service Manager的addService进行注册的函数,以AudioFlinger为例,instantiate代码如下:

1: void AudioFlinger::instantiate() {

2:defaultServiceManager()->addService(

3:String16("media.audio_flinger"), new AudioFlinger());

4: }

4、最后调用ProcessState的startThreadPool方法和IPCThreadState的joinThreadPool使Media Server进入等待请求的循环当中。

我们可以看出一个进程中可以有多个Service,Media Server这个进程中就存在AudioFlinger,MediaPlayerService,CameraService,AudioPolicyService四个Service。

2、系统Service的基础BBinder

我们仔细查看一下Media Server中定义的四个Service我们将会发现他们都是继承自BBinder,而BBinder又继承自IBinder接口,详细情况请自行查看他 们的代码。每个Service都改写了BBinder的onTransact虚函数,当用户发送请求到达Service时,框架将会调用Service的 onTransact函数,后面我们将会详细的介绍这个机制。

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

人工智能实验室
相关文章相关文章
  • 韩春雨称已能重复实验结果 近期将有消息公布

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

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

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

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

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

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

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

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

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

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

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

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