WEB开发网
开发学院手机开发Android 开发 Android Service深入分析 阅读

Android Service深入分析

 2010-05-14 16:24:00 来源:WEB开发网   
核心提示:这个c++空间的对象把数据传递给Binder Driver,接收数据也是通过ProcessState这个对象完成,Android Service深入分析(4),ProcessState是所有Binder IPC必经的通道,ProcessState放置在全局变量gProcess中,在ProcessState中并不使用这个
这个c++空间的对象把数据传递给Binder Driver,接收数据也是通过ProcessState这个对象完成,ProcessState是所有Binder IPC必经的通道。

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 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(...)

}

}

上一页  1 2 3 4 

Tags:Android Service 深入

编辑录入:coldstar [复制链接] [打 印]
赞助商链接