Android - Binder机制 - ProcessState和IPCThreadState

以下几篇文章是较深入分析binder机制。

目录

1. Android - Binder机制 - ServiceManager

2. Android - Binder机制 - 普通service注册

3. Android - Binder机制 - 获得普通service

4. Android - Binder机制 - client和普通service交互

5. Android - Binder机制 - Binder框架总结

6. Android - Binder机制 - ProcessState和IPCThreadState

7. Android - Binder机制 - 驱动

Android - Binder机制 - ProcessState和IPCThreadState

IPCThreadState看上去复杂

初看IPCThreadState代码一头雾水,之所以复杂,是因为IPCThreadState的代码一部分给客户端使用,一部分给服务端使用,两个一掺杂,所以就乱了。如socket编程,客户端和服务端有很多一样的操作(如打开socket、read、write、close等),也有一些不一样的操作(如服务端多了listen和accept,客户端多了connect),如果我们将服务端和客户端的代码写在一起,如果你不懂socket编程,肯定会觉得很复杂。但是,如果我们先定义一个基类来完成服务端客户端相同的操作,然后再创建两个继承类,分别执行服务端和客户端不一样的操作,相信这样让程序员一眼就能看出其中的关系。IPCThreadState就是因为将服务端和客户端写在了一起,所以显得比较复杂。
IPCThreadState主要的函数有sendReply、waitForResponse、joinThreadPool、transact、talkWithDriver、writeTransactionData、executeCommand等。下面我们分析IPCThreadState的服务端和客户端的流程和使用了上面哪些主要函数,你会发现这些大部分函数或者只为客户端使用或者只为服务端使用。


服务端

Socket服务端一般要进行哪些操作呢?

初始化
打开一个socket,bind要监听的端口号和ip地址
变为服务端
执行listen,一个普通(默认是客户端)的socket就变为了服务端
监听
执行accept
接收数据
recv数据
处理数据
根据业务进行相关处理
反馈数据
Send数据
关闭
执行Close


相应的binder如何处理一个服务端呢?

初始化
打开binder设备,如sp<ProcessState> proc(ProcessState::self())里执行了open_binder函数。
变为服务端
执行AddService,如CameraService::instantiate()
监听
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
这俩其实都是起监听的作用,binder不像socket只有一个监听,binder可以支持很多监听线程,ProcessState::self()->startThreadPool()其实也是调用的IPCThreadState::self()->joinThreadPool()。joinThreadPool里循环调用talkWithDriver,该函数其实就是扫描设备是否有数据。
接收数据
接收数据和监听是在一起的,这里其实很像UDP的socket编程,UDP是没有accept步骤的。
反馈数据
executeCommand对各种指令进行处理,该函数会在后面详解。
executeCommand处理的时候有些需要反馈的数据写到mOut缓冲,那什么时候发送mOut的数据呢,其实还是joinThreadPool的talkWithDriver,也就是在这可以看出joinThreadPool同时干两个事,一个是接收数据,一个是发送数据。
关闭
Close(mProcess->mDriverFD)


客户端

Socket客户端一般要进行哪些操作呢?

初始化
打开一个socket
连接服务端
执行connect
发送请求
send数据
接收反馈
recv数据
关闭
执行Close


相应的binder如何处理一个客户端呢?

初始化
打开binder设备,如camera客户端在哪打开的呢,看看getCameraService函数里面为了获得服务,先获得ServiceManager的函数defaultServiceManager(),该函数执行了ProcessState::self()->getContextObject(NULL),ProcessState::self()就会打开binder设备。
连接服务端
执行GetService,通过ServiceManager获得了服务的Handle,以后就是靠这个Handle和服务端打交道的,就想socket的整数句柄。另外,客户端业务层并不直接使用Handle,而使用了Bpxxx,它是服务端在客户端的代理(只是为了客户端写代码更方便)。
发送请求
执行remote()->transact,而实际是执行的IPCThreadState::transact,该函数又执行了writeTransactionData(BC_TRANSACTION, flags, handle, code, data, NULL),该函数将要发送的数据先写入到发送缓存(mOut),又一次注意参数handle,它指定哪个服务端来处理。真正的发送是在waitForResponse(reply)的talkWithDriver。
接收反馈

接收也是在waitForResponse(reply)的talkWithDriver函数。

talkWithDriver将需要发送的请求buf和接收buf(即binder_write_read bwr)同时送入binder驱动,请求和发送是一个堵塞过程(ioctrl(binder_fd, BINDER_WRITE_READ, &bwr))。

关闭
执行Close
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值