Service深入分析完整版_第1頁
Service深入分析完整版_第2頁
Service深入分析完整版_第3頁
Service深入分析完整版_第4頁
Service深入分析完整版_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Service深入分析上一章我們分析了AndroidIPC架構(gòu),知道了Android服務(wù)構(gòu)建的一些基本理念和原理,本章我們將深入分析Android的服務(wù)。Android體系架構(gòu)中三種意義上服務(wù):Native服務(wù)Android服務(wù)Init空間的服務(wù),主要是屬性設(shè)置,這個(gè)IPC是利用Socket來完成的,這個(gè)我將在另外一章來討論。Navite服務(wù),實(shí)際上就是指完全在C++空間完成的服務(wù),主要是指系統(tǒng)一開始初始化,通過Init.rc腳本起來的服務(wù),例如ServiceMangerservice,Zygoteservice,Mediaservice,ril_demonservice等。Android服務(wù)是指在JVM空間完成的服務(wù),雖然也要使用Navite上的框架,但是服務(wù)主體存在于Android空間。Android是二階段初始(Init2)初始化時(shí)建立的服務(wù)。1Service本質(zhì)結(jié)構(gòu)我們還是從Service的根本意義分析入手,服務(wù)的本質(zhì)就是響應(yīng)客戶端請(qǐng)求。要提供服務(wù),就必須建立接收請(qǐng)求,處理請(qǐng)求,應(yīng)答客服端的框架。我想在AndroidService設(shè)計(jì)者也會(huì)無時(shí)不刻把這個(gè)服務(wù)本質(zhì)框圖掛在腦海中。從程序的角度,服務(wù)一定要存在一個(gè)閉合循環(huán)框架和請(qǐng)求處理框架

分析清楚服務(wù)框就必須弄清楚以下的機(jī)制及其構(gòu)成。(1)閉合循環(huán)結(jié)構(gòu)放置在哪里?(2)處理請(qǐng)求是如何分發(fā)和管理?(3)處理框架是如何建立的?(4)概念框架是如何建立的?2Service基本框架分析Android設(shè)計(jì)中,NativeService和AndroidService采用了同一個(gè)閉合循環(huán)框架。這個(gè)閉合循環(huán)框架放置在Native的C++空間中,,ProcessState@ProcessState.cpp和IPCThreadState@IPCThreadState.cpp兩個(gè)類完成了全部工作。

在服務(wù)框架中,ProcessState是公用的部分,這個(gè)公用部分最主要的框架就是閉合循環(huán)框架和接收到從Binder來的請(qǐng)求后的處理框架。我們將服務(wù)框架用ProcessSate來表示,簡(jiǎn)言之:(1)addservice(2)建立閉合循環(huán)處理框架。intmain(intargc,char**argv){sp<ProcessState>proc(ProcessState::self());addService(String16("xxx0"),newxxx0Service());addService(String16("xxx1"),newxxx1Service());…ProcessState::self()->startThreadPool();IPCThreadState::self()->joinThreadPool();//閉合循環(huán)框架}

2.1NativeServiceNativeService是在系統(tǒng)Init階段通過Init.rc腳本建立的服務(wù)。首先來看看一個(gè)例子mediaserver@main_mediaserver.cpp的建立過程。intmain(intargc,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();}我們將代碼向下展開了一層,更能看到事物的本質(zhì)。intmain(intargc,char**argv){sp<ProcessState>proc(ProcessState::self());sp<IServiceManager>sm=defaultServiceManager();defaultServiceManager()->addService(String16("media.audio_flinger"),newAudioFlinger());…ProcessState::self()->startThreadPool();IPCThreadState::self()->joinThreadPool();}(1)服務(wù)進(jìn)程建立了ProcessState對(duì)象,并將給對(duì)象登記在進(jìn)程的上下文中。(2)建立一個(gè)新AudioFlinger對(duì)象,并將對(duì)象登記ServiceManagerService中。(3)開始就收請(qǐng)求,處理請(qǐng)求,應(yīng)答這個(gè)循環(huán)閉合框架。2.2AndroidServiceAndroidsservice是系統(tǒng)二階段(Init2)初始化時(shí)建立的服務(wù)。Android的所有服務(wù)循環(huán)框架都是建立SystemServer@(SystemServer.java)上。在SystemServer.java中看不到循環(huán)結(jié)構(gòu),只是可以看到建立了init2的實(shí)現(xiàn)函數(shù),建立了一大堆服務(wù),并AddService到serviceManager。main()@com/android/server/SystemServer{init1();}Init1()是在Native空間實(shí)現(xiàn)的(com_andoird_server_systemServer.cpp)。我們一看這個(gè)函數(shù)就知道了,原來這個(gè)閉合循環(huán)處理框架在這里:init1->system_init()@System_init.cpp在system_init()我們看到了這個(gè)久違的循環(huán)閉合管理框架。{Call"com/android/server/SystemServer","init2"…..ProcessState::self()->startThreadPool();IPCThreadState::self()->joinThreadPool();}Init2()@SystemServer.java中建立了Android中所有要用到的服務(wù):EntropyServicePowerManagerActivityManagerTelephonyRegistryPackageManagerAccountManagerContentManagerSystemContentProvidersBatteryServiceHardwareServiceAlarmManagerInitWatchdogSensorServiceWindowManagerBluetoothServicestatusbarClipboardServiceInputMethodServiceNetStatServiceConnectivityServiceAccessibilityManagerNotificationManagerMountServiceDeviceStorageMonitorLocationManagerSearchServiceCheckinServiceWallpaperServiceAudioServiceHeadsetObserverBackupServiceAppWidgetService3ProcessState和IPCThreadState從宏觀來講,PocessState及其IPCThreadState處于IPC與內(nèi)核打交道包裝層。前面的章節(jié)已經(jīng)提到,下面我將更詳細(xì)的分析。有關(guān)IPC的c++空間的實(shí)現(xiàn)都是從ProcessState這個(gè)對(duì)象完成的。

我們可以得出如下的結(jié)論:不管JVM的Binder做了多么復(fù)雜的操作,最終還是需要利用ProcessState這個(gè)c++空間的對(duì)象把數(shù)據(jù)傳遞給BinderDriver,接收數(shù)據(jù)也是通過ProcessState這個(gè)對(duì)象完成,ProcessState是所有BinderIPC必經(jīng)的通道。

ProcessState放置在全局變量gProcess中,每個(gè)進(jìn)程只有一個(gè)ProcessState對(duì)象,負(fù)責(zé)打開Binder設(shè)備驅(qū)動(dòng),建立線程池等。而IPCThreadState每個(gè)線程有一個(gè),IPCThreadState實(shí)例登記在Linux線程程的上下文附屬數(shù)據(jù)中,主要負(fù)責(zé)Binder數(shù)據(jù)讀取,寫入和請(qǐng)求處理框架。IPCThreadSate在構(gòu)造的時(shí)候,獲取進(jìn)程的ProcessSate并記錄在自己的成員變量mProcess中,通過mProcess可以獲取到Binder的句柄。3.1ProcessState的生命周期既然ProcessState是Binder通訊的基礎(chǔ),那么Process必須在Binder通訊之前建立。客戶端,服務(wù)端都必須建立。由于現(xiàn)在重點(diǎn)討論服務(wù)端,所以重心放置在服務(wù)端。在Android體系中有c++空間的服務(wù),JVM空間的服務(wù),這兩類服務(wù)在本質(zhì)上相同的,只是形式上不同,由于他們都是建立在ProcessState這個(gè)基礎(chǔ)上,所以在形式上不同就僅僅表現(xiàn)在對(duì)OnTransact的回調(diào)處理的不同。NativeService我們直接可以看到使用sp<ProcessState>proc(ProcessState::self()),建立建立ProcessState,一旦調(diào)用ProcessState就建立了,并且這個(gè)self將ProcessSate登記在全局變量中。AndroidService建立AndroidService服務(wù)system_init@System_init.cpp中我們可以看到相同的結(jié)構(gòu)。有一點(diǎn)不同的是所有的AndroidService都運(yùn)行在一個(gè)進(jìn)程中:systemsever進(jìn)程。3.2BinderDriver包裝@IPCThreadStateProcessSate構(gòu)造的時(shí)候,使用open_binder打開/driver/binder,并將句柄記錄在mDriverFD,在ProcessState中并不使用這個(gè)句柄,真正使用這個(gè)Binder設(shè)備句柄的是IPCThreadState,所有關(guān)于Binder的操作放置在IPCThreadState中:(1)讀取\寫入:talkWithDriver()@IPCThreadState對(duì)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論