原文转自:http://blog.csdn.net/maxleng/article/details/5504485

Service深入分析

上一章我们分析了AndroidIPC架构,知道了Android服务构建的一些基本理念和原理,本章我们将深入分析Android的服务。Android体系架构中三种意义上服务:

  • Native服务
  • Android服务
  • Init空间的服务,主要是属性设置,这个IPC是利用Socket来完成的,这个我将在另外一章来讨论。

Navite服务,实际上就是指完全在C++空间完成的服务,主要是指系统一开始初始化,通过Init.rc脚本起来的服务,例如ServiceMangerservice,Zygoteservice,Mediaservice,ril_demonservice等。

Android服务是指在JVM空间完成的服务,虽然也要使用Navite上的框架,但是服务主体存在于Android空间。Android是二阶段初始(Init2)初始化时建立的服务。

1Service本质结构

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


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

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

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

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

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

2Service基本框架分析

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

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

(1)addservice

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

intmain(intargc,char**argv)

{

sp<ProcessState>proc(ProcessState::self());

addService(String16("xxx0"),newxxx0Service());

addService(String16("xxx1"),newxxx1Service());

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

IPCThreadState::self()->joinThreadPool();//闭合循环框架

}


2.1NativeService

NativeService是在系统Init阶段通过Init.rc脚本建立的服务。

首先来看看一个例子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();

}

我们将代码向下展开了一层,更能看到事物的本质。

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)服务进程建立了ProcessState对象,并将给对象登记在进程的上下文中。

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

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

2.2AndroidService

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

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

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中所有要用到的服务:

EntropyService

PowerManager

ActivityManager

TelephonyRegistry

PackageManager

AccountManager

ContentManager

SystemContentProviders

BatteryService

HardwareService

AlarmManager

InitWatchdog

SensorService

WindowManager

BluetoothService

statusbar

ClipboardService

InputMethodService

NetStatService

ConnectivityService

AccessibilityManager

NotificationManager

MountService

DeviceStorageMonitor

LocationManager

SearchService

CheckinService

WallpaperService

AudioService

HeadsetObserver

BackupService

AppWidgetService

3ProcessState和IPCThreadState

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


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


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

3.1ProcessState的生命周期

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

NativeService

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

AndroidService

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

3.2BinderDriver包装@IPCThreadState

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

(1)读取/写入:talkWithDriver()@IPCThreadState对ioctl(mProcess->mDriverFD,BINDER_WRITE_READ,&bwr)进行包装。

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

(3)循环结构:joinThreadPool()

joinThreadPool()

{

While(1){

talkWithDriver(...)

...

executeCommand(...)

}

}


有用的回复:


----刚刚也在学习android的知识:大家可以看看这篇文档:非常棒:Android Anatomy and Physiology, 在参照例子,如果基础可以,应该是非常好文档的;推荐一下给大家

----对了,还有一个问题,就是system server 进程中有很多service,那么这些service 各自是如何运行的呢?它们是否跑在不同的线程呢?

Re: voipmaker2012-03-10 20:06发表[回复][引用][举报]
回复daydreaming_111:大部分服务会启动一个java线程。

-----我发现这篇文章 和 http://blog.csdn.net/innost/article/details/6124685
这篇联系起来阅读很有效果。

-----

41楼 stonecao2011-08-02 11:36发表[回复][引用][举报]
1.我有一个问题,是不是每个应用进程都会调用ProcessState::self()->startThreadPool();来启动一个线程对binder消息进行监听,systemServer我知道是有起的,System_init.cpp 中有调用,但是我们普通的应用它在哪里起的ProcessState::self()->startThreadPool(),我没有搞清楚,麻烦指点一下,谢谢!
2.代理端调用,我大概理解调用逻辑:
java层使用binderproxy.transact调用rpc对象,对应jni封装了该native方法:
android_util_Binder.android_os_BinderProxy_transact->
BpBinder::transact->IPCThreadState::self()->transact(
mHandle, code, data, reply, flags);
binder驱动通过mHandle找到目标service把消息发送到目标进程去处理。
对于service进程如何接受并处理数据的呢?
根据你的讲解
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
我从函数名猜测,第一个函数启动一个线程池等待接受来自客户端binder消息并处理
第二个函数,本线程(主线程)的IPCThreadState对象调用joinThreadPool建立闭合消息循环来接受binder消息,接受消息后分发给前面线程池中线程去处理。
具体如何从截取消息到分发到每个service.ontransact还是没有了解清楚,希望楼主能够把这块也详细讲一下,不胜感激!

更多相关文章

  1. Afinal 是一个android的sqlite orm 和 ioc 框架。同时封装了andr
  2. Android---进程间通机制的简单理解
  3. 整理 酷炫 Android、Flutter 开源UI框架
  4. 【源码分享下载】每日更新之Android快速开发框架LoonAndroid
  5. SSH服务器与Android通信(2)--Android客户端接收数据
  6. android客户端和servlet服务端的简单登录实现
  7. Android启动过程深入解析
  8. 《Android(安卓)开发艺术探索》笔记2--IPC机制
  9. android常见的研究方向

随机推荐

  1. Android学习资料分享
  2. android 去除ScrollVIew拉到尽头时再拉的
  3. Android圆形进度显示控件的SectorProgres
  4. 关于android生命周期那点事
  5. MTK Android Driver :sound
  6. 新添的Activity 要在 manifest 中注册 否
  7. android 设置 源码 修改默认主题为白底黑
  8. [置顶] android 心跳包的分析
  9. Android Permission中英对照
  10. MyEclipse10 配置 Android SDK 时遇到的