By 高焕堂 2011/09/09  

[ IT史上最完整、最经典的软件框架开发技术宝典 (上百篇经典文章&eBooks) ] 

[ 請指教:高老師的免費on-line教學視頻 ] 

                                                                                                            

[Go Back] 

 

 

HAL(Hardware Abstraction Layer)技术观点(6): 

ServiceManager和IBinder扮演什么角色呢? 

 

1. ServiceManager的角色:它也是一项Core Service

      ServiceManager本身也是一个Native Service,而且是天字第一号的系统服务(System Service)。在系统启动时(即执行init.rc时),就会立即启动它,并登记(Register)成为Binder Driver里的第一号Native Service。如下图所示:

  

图1、Service Manager是天字第一号系统服务

 

2. ServiceManager负责登记其它的System Service

      在Android 2.1版本里,init.rc也会启动Java层的SensorService服务(即SensorService.java),并透过ServiceManager去登记到Binder Driver里,成为另一个系统服务。如下图所示:

 

图2、init.rc 启动了许多系统服务

     在开机过程中,会启动许多项系统服务,ServiceManager和SensorService只是其中的两个而已。

 

3. IBinder的角色

    启动完成后,就能让C++层或Java层的Client模块来绑定(Bind)、连结(Connect)和呼叫(Invoke)这些系统服务了。例如,C++层Client模块可以绑定ServiceManager而取得它的IBinder接口(Interface),然后透过IBinder而呼叫到ServiceManager的transact()函数。如下图: 

 

 图3、C++层Client呼叫Service Manager

       这C++ Client能使用C++层的ServiceManager服务,但无法使用Java层的SensorService服务了。 

 [歡迎光臨 高煥堂 網頁: http://www.cnblogs.com/myEIT/ ]

 

4. 使用ServiceManager的IServiceManager接口

      由于IBinder接口里只有一个transact()函数,无法呈现ServiceManager核心服务的各项功能或函数。徒增加C++ Client模块开发者的麻烦。于是,在C++层增添一个ServiceManager.cpp类别,扮演Adapter的角色,将IBinder接口包装起来,转换出可呈现ServiceManager服务各项功能的新接口(即IServiceManager)。同样地,在Java层也增添一个ServiceManager.java类别,扮演Adapter的角色,将IBinder接口包装起来,转换出可呈现ServiceManager服务各项功能的新接口(即IServiceManager)。如下图: 

 

 图4、Service Manager的Adapter类别 

       于是,C++ Client模块就能使用较亲切的IServiceManager接口来呼叫ServiceManager的功能了。如下图:

 

 图5、C++ 层Client使用IServiceManager接口

      同样地,Java Client模块就能使用较亲切的IServiceManager接口来呼叫ServiceManager的功能了。如下图: 

 

 图6、Java 层Client使用IServiceManager接口

      例如,Java Client模块可以呼叫IServiceManager接口里的getService()函数来绑定(即去Binder Driver里取出)SensorService服务,此时ServiceManager会将SensorService的IBinder接口回传给Java Client模块。接者,Java Client模块就能呼叫IBinder接口里的transact()函数,进而透过JNI而呼叫到HAL模块。如下图:

 

图7、Java 层Client使用SensorService的IBinder接口

      由于IBinder接口里只有一个transact()函数,无法呈现SensorService核心服务的各项功能或函数。徒增加Java Client模块开发者的麻烦。于是,增添一个Java层的IServiceService.Stub类别(可依循AIDL途径去建构此类别,或自行设计此类别),扮演Adapter的角色,将IBinder接口包装起来,转换出可呈现SensorService服务各项功能的新接口(即ISensorService)。于是,Java Client模块就能使用较亲切的ISensorService接口来呼叫SensorService的功能了。如下图:

 

 图8、Java 层Client使用SensorService的ISensorService接口

      上图里的SernsorService系统服务是以Java撰写的。前面说明过,系统服务能以C++或Java来撰写,如果改用C++来撰写的话,就由C++层的SensorService系统服务来呼叫HAL模块,并提供IBinder接口。然后在撰写一个Java层的SensorService.java类别来提供ISensorService接口给Java Client来使用。如下图:

 

 图9、以C++ 改写SensorService核心服务

       系统服务是开机时先启动的服务;而Client是开机完成后,才启动的应用程序。这两个时间点是不相同的,但都需要ServiceManager的幕后协助才能完成之。在开机阶段,ServiceManager协助将系统服务登记到Binder Driver里;而在应用程序执行阶段,ServiceManager则协助将从Binder Driver里找出所要的系统服务,并回传其IBinder接口。

[Go Back]