ServiceManager和IBinder的扮演角色

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值