l 前言 java
到底甚麼是Android Service呢? 幾乎人人所談都不盡相同。有人依據Java的套件而分,例如Android 2.1裡,SensorService.java和ActivityManagerService.java屬於不一樣的套件,有人說SensorService是一項Android Service;而ActivityManagerService則不是。另有人說兩者都屬於Android Service。本文就從HAL的角度來看Android Service與其餘相關模組的關係,例如Android Service與JNI之關係。從這些關係裡,更能深入掌握Android Service的定位和角色。 android
l 三種服務 app
只要一談到Android Service,幾乎人人所談都不盡相同了。更不用說又加上SDK Service了。例如,Android 專家Jollen寫道: 框架
「Android的Service分為二種:Android Service與Native Service。 spa
Android Service .net
AndroidService又稱為Java Service,是實做在框架層(framework)裡的「Server」。這裡所講的「Service」是System Service,又稱為Server,與應用程式設計上所討論的Service(android.app.Service)不一樣。Android Service以Java撰寫。 orm
Native Service get
NativeService則是實做在Runtime層裡的Server。架構設計上,我們有二個選擇,一個是實做Android Service、再透過JNI與HAL stub溝通;另外一個選擇是,跳過Android Service,讓Application(Manager API)直接與Native Service溝通。」 it
Jollen在這段話裡,明顯地提到兩種服務:Android Service和Native Service。然而,他又提到:「與應用程式設計上所討論的Service(android.app.Service)不一樣。」這種android.app.Service就是通常通稱的APP Service或SDK Service了。因此Jollen提到三種服務:1)SDK Service、2)Android Service和3)Native Service。其關係以下圖: io
圖一、三種Service
l Android Service與 JNI等元素之關係
那麼,這些元素之間又有何關係呢? Jollen在其文章裡,寫道:
「採取Service架構的方式,是建議的作法,當然因為這是標準架構,也應該採用。
Service在Android框架裡的角色是「存取底層硬體」,往上層的話,能夠和應用程式溝通。所以,採用標準的Service作法,好處是在資料存取(datacommunication)的處理較為系統化。這方面,Android提供了標準的處理架構,後續再進行討論。圖上的「corelibraries」便是Service程式碼的實做,也就是,Android應用程式透過JNI(Dalvik)來到Service這一層,再透過Service載入*.so檔;而非標準作法則是讓應用程式直接透過JNI來載入*.so檔。」
l 非標準作法
其中,非標準作法:讓應用程式直接透過JNI來載入*.so檔。其架構以下圖:
圖二、非標準作法
非標準作法也是可(執)行的途徑之一。
l 標準作法
至於Jollen所說的標準作法:
「Android應用程式透過JNI(Dalvik)來到Service這一層,再透過Service載入*.so檔;」
其架構以下圖:
圖三、標準作法
l Native作法
以上兩種作法,都是可行的。此外,還有另外一種更具彈性的作法,就是採取Native Service途徑。就如Jollen最近(2011/1/3)更進一步說明Native Service扮演更重要的角色:
「近期在進行 Android 2.3 的新框架程式碼研究,Android 2.3 在 Platform (Framework) 部份包含了許多重大的更新,其中一個部份就是 SensorService 改寫成 Native Service 形式。在 Android 2.2 之前的框架,SensorService 包含在 SystemServer 裡,實務上,可能也會對 SensorService 作小幅度改寫,以增進效能,或是將 SensorService 獨立成為一個 process。
在 Android2.3 裡的 SystemServer 已經找不到 SensorService 了,這個重要的 Android Service 被改寫成 Native Service。「如何將 AndroidService 改寫為 Native Service」,以及「Native Service」的開發,從 Android 2.3 開始,將成為重量級主題。由於本週即將進行「Android HAL & Framework: 軟硬整合實做訓練」課程,利用元旦假期,也順利完成課程以及教材的更新,將開始著重 Native Service 的講解,並透過實例解說 Native Service 的開發。」
將Java的SensorService 改寫成C++的 Native Service 形式,其新的架構將更改以下圖:
圖四、Native Service作法
此種Native Service作法並不是新作法,其實自從Android問市以來,MediaPlayerService和CameraService等便是採取Native Service作法了。無論哪一種作法,JNI Native Code都扮演重要角色