歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android Service分析

Android體系架構中三種意義上服務:

  •  Native服務
  •  Android服務
  •  Init空間的服務,主要是屬性設置,這個IPC是利用Socket來完成的,這個我將在另外一章來討論。

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

}

2.1 Native Service 

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)開始就收請求,處理請求,應答這個循環閉合框架。

Copyright © Linux教程網 All Rights Reserved