l ServiceManager的角色:它也是一項Core Service
ServiceManager本身也是一個Native Service,而且是天字第一號的核心服務(Core Service)。在系統啟動時(即執行init.rc時),就會立即啟動它,並登記(Register)成為Binder Driver裡的第一號Native Service。如下圖所示:
圖1、Service Manager是天字第一號核心服務
l ServiceManager負責登記其他的Core Service
在Android 2.1版本裡,init.rc也會啟動Java層的SensorService服務(即SensorService.java),並透過ServiceManager去登記到Binder Driver裡,成為另一個核心服務。如下圖所示:
圖2、 init.rc 啟動了許多核心服務
在開機過程中,會啟動許多項核心服務,ServiceManager和SensorService只是其中的兩個而已。
l IBinder的角色
啟動完成後,就能讓C++層或Java層的Client模組來綁定(Bind)、連結(Connect)和呼叫(Invoke)這些核心服務了。例如,C++層Client模組可以綁定ServiceManager而取得它的IBinder接口(Interface),然後透過IBinder而呼叫到ServiceManager的transact()函數。如下圖:
圖3、 C++層Client呼叫Service Manager
l 使用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()函數來綁定(即去BinderDriver裡取出)SensorService服務,此時ServiceManager會將SensorService的IBinder接口回傳給Java Client模組。
l ServiceManager負責綁定及呼叫其他的Core Service
接者,Java Client模組就能呼叫IBinder接口裡的transact()函數,進而透過JNI而呼叫到HAL模組。如下圖:
圖7、Java 層Client使用SensorService的IBinder接口
由於IBinder接口裡只有一個transact()函數,無法呈現SensorService核心服務的各項功能或函數。徒增加Java Client模組開發者的麻煩。於是,增添一個Java層的IServiceService.Stub類別(可依循AIDL途徑去建構此類別,或自行設計此類別),扮演Adapter的角色,將IBinder接口包裝起來,轉換出可呈現SensorService服務各項功能的新接口(即ISensorService)。於是,JavaClient模組就能使用較親切的ISensorService接口來呼叫SensorService的功能了。如下圖:
圖8、Java 層Client使用SensorService的ISensorService接口
上圖裡的SernsorService核心服務是以Java撰寫的。前面說明過,核心服務能以C++或Java來撰寫,如果改用C++來撰寫的話,就由C++層的SensorService核心服務來呼叫HAL模組,並提供IBinder接口。
l 比較Java層與C++層Core Service的使用途徑
然後在撰寫一個Java層的SensorService.java類別來提供ISensorService接口給Java Client來使用。如下圖:
圖9、以C++ 改寫SensorService核心服務
核心服務是開機時先啟動的系統服務;而Client是開機完成後,才啟動的應用程式。這兩個時間點是不相同的,但都需要ServiceManager的幕後協助才能完成之。在開機階段,ServiceManager協助將核心服務登記到Binder Driver裡;而在應用程式執行階段,ServiceManager則協助將從Binder Driver裡找出所要的核心服務,並回傳其IBinder接口。
原文链接:http://www.android1.net/Topic.aspx?BoardID=31&TopicID=2616