Android 核心分析 之7-Service深入分析

Android 核心分析 之七------Service深入分析原文地址:http://blog.csdn.net/maxleng/article/details/550

Android 核心分析 之七------Service深入分析

原文地址:http://blog.csdn.net/maxleng/article/details/5504485

?

Service深入分析

?

?

?

2.1?Native?Service?


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

?

3.1?ProcessState的生命周期

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

?

Native?Service?

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

?

?

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()@IPCThreadState对ioctl(mProcess->mDriverFD,?BINDER_WRITE_READ,?&bwr)进行包装。

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

(3)循环结构:joinThreadPool()

joinThreadPool()

{

While(1){

talkWithDriver(...)

...

executeCommand(...)

}

}