Chinaunix首页 | 论坛 | 博客
  • 博客访问: 489384
  • 博文数量: 153
  • 博客积分: 3010
  • 博客等级: 中校
  • 技术积分: 1724
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-08 11:55
文章分类

全部博文(153)

文章存档

2011年(1)

2010年(55)

2009年(88)

2008年(9)

我的朋友

分类: LINUX

2010-10-27 17:28:01


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)初始化时建立的服务。

1 Service本质结构

我们还是从Service的根本意义分析入手,服务的本质就是响应客户端请求。要提供服务,就必须建立接收请 求,处理请求,应答客服端的框架。我想在Android Service设计者也会无时不刻把这个服务本质框图挂在脑海中。从程序的角度,服务一定要存在一个闭合循环框架和请求处理框架


分析清楚服务框就必须弄清楚以下的机制及其构成。

1)闭合循环结构放置在哪里?

2)处理请求是如何分发和管理?

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

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

2 Service基 本框架分析

     Android设计中,Native ServiceAndroid Service采用了同一个闭合循环 框架。这个闭合循环框架放置在NativeC++空间中,,ProcessState@ProcessState.cpp 两 个类完成了全部工作。

 

在服务框架中,ProcessState是公用的部分,这个公用部分最主要的框架就是闭合循环框架和接收到从Binder来的请求后的处理框架。我们将服务框架用ProcessSate来表示,简言之:

(1) addservice

(2) 建立闭合循环处理框架。

int main(int argc, char** argv)

{

sp 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 proc(ProcessState::self());

    sp 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 proc(ProcessState::self());

sp sm = defaultServiceManager();

defaultServiceManager()->addService(String16("media.audio_flinger"), new AudioFlinger());

ProcessState::self()->startThreadPool();

IPCThreadState::self()->joinThreadPool();

}

 

1)服务进程建立了ProcessState对象,并将给对象登记 在进程的上下文中。

2)建立一个新AudioFlinger对象,并将对象登记Service Manager Service中。

3)开始就收请求,处理请求,应答这个循环闭合框架。

 

2.2 Android Service

Androids service是系统二阶段(Init2初始化 时建立的服务。

Android的所有服务循环框架都是建立SystemServer@(SystemServer.java上。 在SystemServer.java中看不到循环结构,只是可以看到建立了init2的实现函数,建立了一大堆服务,并AddService到 service Manager。

main() @ com/android/server/SystemServer 

{

init1();

}

Init1()是在Native空间实现的(com_andoird_server_systemServer.cpp)。 我们一看这个函数就知道了,原来这个闭合循环处理框架在这里:

init1->system_init() @System_init.cpp

 

system_init()我们看到了这个久违的循环闭合管理框架。

{

Call "com/android/server/SystemServer", "init2"

….. 

ProcessState::self()->startThreadPool();

    IPCThreadState::self()->joinThreadPool();

}

 

Init2()@SystemServer.java中建立了Android中 所有要用到的服务:

Entropy Service

Power Manager

Activity Manager

Telephony Registry

Package Manager

Account Manager

Content Manager

System Content Providers

Battery Service

Hardware Service

Alarm Manager

Init Watchdog

Sensor Service

Window Manager

Bluetooth Service

statusbar

Clipboard Service

Input Method Service

NetStat Service

Connectivity Service

Accessibility Manager

Notification Manager

Mount Service

Device Storage Monitor

Location Manager

Search Service

Checkin Service

Wallpaper Service

Audio Service

Headset Observer

Backup Service

AppWidget Service

3  ProcessStateIPCThreadState

 

从宏观来讲,PocessState及其IPCThreadState处 于IPC与内核打交道包装层。前面的章节已经提到,下面我将更详细的分析。有关IPCc++空 间的实现都是从ProcessState这个对象完成的。


我们可以得出如下的结论:不管JVMBinder做 了多么复杂的操作,最终还是需要利用ProcessState 这个c++空 间的对象把数据传递给Binder Driver,接收数据也是通过ProcessState这 个对象完成,ProcessState是所有Binder IPC必 经的通道。

 


 

ProcessState放置在全局变量gProcess中, 每个进程只有一个ProcessState对象,负责打开Binder设 备驱动,建立线程池等。而IPCThreadState每个线程有一个,IPCThreadState实 例登记在Linux线程程的上下文附属数据中,主要负责Binder数据读取,写入和请求处理框架。IPCThreadSate在 构造的时候,获取进程的ProcessSate并记录在自己的成员变量mProcess,通 过mProcess可以获取到Binder的 句柄。

 

3.1 ProcessState的生命周期

      既然ProcessStateBinder通 讯的基础,那么Process必须在Binder通 讯之前建立。客户端,服务端都必须建立。由于现在重点讨论服务端,所以重心放置在服务端。在Android体 系中有c++空间的服务,JVM空间的服 务,这两类服务在本质上相同的,只是形式上不同,由于他们都是建立在ProcessState这个基础上,所以在形式上不同就仅仅表现在对OnTransact的 回调处理的不同。

Native Service 

我们直接可以看到使用 sp proc(ProcessState::self()),建立建立ProcessState, 一旦调用ProcessState就建立了,并且这个selfProcessSate登 记在全局变量中。

Android Service

建立Android Service服 务system_init @System_init.cpp中我们可以看到相同的结构。有一点不 同的是所有的Android Service都运行在一个进程中:systemsever进 程。

 

3.2 Binder Driver包装 @IPCThreadState

      ProcessSate构造的时候, 使用open_binder打开/driver/binder,并将句柄记录在mDriverFD, 在ProcessState中并不使用这个句柄,真正使用这个Binder设 备句柄的是IPCThreadState,所有关于Binder的 操作放置在IPCThreadState中:

 

(1)读取\写入:talkWithDriver()@IPCThreadStateioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr)进 行包装。

(2)请求处理:executeCommand(...)@ IPCThreadState

(3)循环结构:joinThreadPool()

joinThreadPool()

{

While(1){

talkWithDriver(...)

...

executeCommand(...)

}

}


http://blog.csdn.net/maxleng/archive/2010/04/19/5504485.aspx
阅读(2974) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-10-28 18:14:20

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com