By 高焕堂 2011/09/09
[ IT史上最完整、最经典的软件框架开发技术宝典 (上百篇经典文章&eBooks) ]
[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]