Android體系架構中三種意義上服務:
Navite服務,實際上就是指完全在C++空間完成的服務,主要是指系統一開始初始化,通過Init.rc腳本起來的服務,例如Service Manger service,Zygote service,Media service , ril_demon service等。
Android服務是指在JVM空間完成的服務,雖然也要使用Navite上的框架,但是服務主體存在於Android空間。Android是二階段初始(Init2)初始化時建立的服務。
我們還是從Service的根本意義分析入手,服務的本質就是響應客戶端請求。要提供服務,就必須建立接收請求,處理請求,應答客服端的框架。我想在Android Service設計者也會無時不刻把這個服務本質框圖掛在腦海中。從程序的角度,服務一定要存在一個閉合循環框架和請求處理框架
分析清楚服務框就必須弄清楚以下的機制及其構成。
(1)閉合循環結構放置在哪裡?
(2)處理請求是如何分發和管理?
(3)處理框架是如何建立的?
(4)概念框架是如何建立的?
2 Service基本框架分析
Android設計中,Native Service和Android Service采用了同一個閉合循環框架。這個閉合循環框架放置在Native的C++空間中,,[email protected] 和[email protected]兩個類完成了全部工作。
在服務框架中,ProcessState是公用的部分,這個公用部分最主要的框架就是閉合循環框架和接收到從Binder來的請求後的處理框架。我們將服務框架用ProcessSate來表示,簡言之:
(1) addservice
(2) 建立閉合循環處理框架。
int main(int argc, char** argv)
{
sp<ProcessState> proc(ProcessState::self());
addService(String16("xxx0"), new xxx0Service());
addService(String16("xxx1"), new xxx1Service());
…
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();//閉合循環框架
}
Native Service是在系統Init階段通過Init.rc腳本建立的服務。
首先來看看一個例子mediaserver@main_mediaserver.cpp的建立過程。
int main(int argc, char** argv)
{
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
LOGI("ServiceManager: %p", sm.get());
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();
AudioPolicyService::instantiate();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
我們將代碼向下展開了一層,更能看到事物的本質。
int main(int argc, char** argv)
{
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
defaultServiceManager()->addService(String16("media.audio_flinger"), new AudioFlinger());
…
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
(1)服務進程建立了ProcessState對象,並將給對象登記在進程的上下文中。
(2)建立一個新AudioFlinger對象,並將對象登記Service Manager Service中。
(3)開始就收請求,處理請求,應答這個循環閉合框架。