標籤:
終於進入android學習的進階階段,第一個課題是android的核心服務。首先,讓我們來認識一下核心服務。
android核心服務與app服務有所區別。app服務繼承自Service基類,在app運行時啟動並綁定到Activity上。核心服務是在裝置開機時解析init.rc檔案預裝在系統中的,早於任何一個app進程和app服務。app服務是有ActivityManangerServiec啟動並綁定,而核心服務必須在ServiceManager中註冊。
核心服務有分為native service和android service兩種。一般來說,native service有c/c++編寫,主要實現靠近驅動層的功能,android service由java編寫,主要實現靠近app的功能。不管是何種核心服務,都運行在於app不同的進程中,因此,app想要與核心服務通訊就必須使用IPC。
IPC是android中解決處理序間通訊的精巧架構,代碼不多,功能強大。進程A想要與服務所在的進程B通訊,必須先擷取到服務的IBinder介面。IBinder介面,主要實現進程間的關聯,將會在進程A中誕生一個BinderProxy。這個代理類,運行在進程A,將代理所有對進程B中的服務要求。對於進程A來說,就像是自身擁有這個服務。使用這樣的client-server結構完美的實現了高內聚低耦合。
前面提到核心服務由ServiceManager啟動和管理,其他進程要訪問某服務都必須通過ServiceManager才能拿到IBinder介面。啟動核心服務時,其中至關重要的一環是將核心服務登入到ManagerService中,代碼如下:
int r = defaultServiceManager()->addService(String16("xxx"),new SQRService);
此時,意味著該核心服務可以被請求和綁定。請求IBinder介面代碼如下:
m_ib = sm->getService(String16("xxx"));
從軟硬整合的角度來說,核心服務的存在是為了讓上層java應用程式使用Driver/HW Device特色的重要管道。基於android的開源特性,不同硬體廠家會有自主設計、效能各異的硬體裝置,合理編寫c層核心服務有利於充分發揮硬體特性。底層的優越設計將為上層應用的效能和使用者體驗提供強力支撐,可謂android架構中力與美的結合。
設計心得
剛才提到的client-server結構是IPC架構中的重要思想,我們在編寫JNI層小架構的時候,也可以應用這個思想。其中的關鍵之處便是將控制點下移到c層,將服務程式封裝在自己的架構中,高內聚低耦合。c層負責擷取核心服務的IBinder介面並建立java層的BinderProxy對象,將BinderProxy的介面返回到java層。 代碼如下:
sp<IServiceManager> sm = defaultServiceManager();
m_ib = sm->getService(String16("xxx");
jObject ibj = javaObjectForIBinder(env,mib);
android核心服務初探