Android中深入研究Service .

關於Service,不管是Windows還是linux系統,相信大家應該遇到過很多自己解決不了的問題吧,那麼本文來講述一下Android手機系統中的Service .

1 Service本質結構


我們還是從Service的根本意義分析入手,服務的本質就是響應客戶端請求。要提供服務,就必須建立接收請求,處理請求,應答客服端的框架。我想在Android Service設計者也會無時不刻把這個服務本質框圖掛在腦海中。從程序的角度,服務一定要存在一個閉合循環框架和請求處理框架。






分析清楚服務框就必須弄清楚以下的機制及其構成。


(1)閉合循環結構放置在哪裏?


(2)處理請求是如何分發和管理?


(3)處理框架是如何建立的?


(4)概念框架是如何建立的?


2 Service基本框架分析


Android設計中,Native Service和Android Service採用了同一個閉合循環框架。這個閉合循環框架放置在Native的C++空間中。






在服務框架中,ProcessState是公用的部分,這個公用部分最主要的框架就是閉合循環框架和接收到從Binder來的請求後的處理框架。我們將服務框架用ProcessSate來表示,簡言之:


(1) addservice


(2) 建立閉合循環處理框架。


java代碼:


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();//閉合循環框架  

2.1 Native Service


Native Service是在系統Init階段通過Init.rc腳本建立的服務。


java代碼:


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();  

(1)服務進程建立了ProcessState對象,並將給對象登記在進程的上下文中。


(2)建立一個新AudioFlinger對象,並將對象登記Service Manager Service中。


(3)開始就收請求,處理請求,應答這個循環閉合框架。


2.2 Android Service


Androids service是系統二階段(Init2)初始化時建立的服務。


在SystemServer.java中看不到循環結構,只是可以看到建立了init2的實現函數,建立了一大堆服務,並AddService到service Manager。




Init1()是在Native空間實現的(com_andoird_server_systemServer.cpp)。我們一看這個函數就知道了,原來這個閉合循環處理框架在這裏:


init1->system_init() @System_init.cpp


在system_init()我們看到了這個久違的循環閉合管理框架。


java代碼:


{  
Call "com/android/server/SystemServer", "init2"  
ProcessState::self()->startThreadPool();  
IPCThreadState::self()->joinThreadPool();  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章