framework 之Bindle深入


以mediaServer为例来分析Bindle流程:

android4.2  以下文件的代码在framework/Native和framework/av和framework/base中:

        ProcessState,每个进程只有一个processstate对象,该对象的self函数采用单例模式。构造函数中open_driver打开了/dev/binder设备,

他是android在内核中完成进程间通信专门设置的一个虚拟设备,该驱动设备会分配一块内存来接收数据,一个进程只能打开一次Bindle设备。

      defaultServiceManager会返回一个IServiceManager对象,通过这个对象与ServiceManager进行交互,利用BpBinder(客户端与Server的交互),BBinder

代表与BpBinder对应的Server端。用模板函数interface_cast中IBinder类型new出一个BpServiceManager。

      MediaPlayerServer中的main函数,初始化的时候调用BpServiceManager的addService,利用BpBinder的transact函数移交数据通信工作,调用IPCThreadState

的transact函数,然后发送数据,等结果。

    发数据:writeTransactionData(BC_TRANSACTION,flag,handle,code,data,null)第一个参数BC_TRANSACTION是应用程序向binder设备发送消息的消息码,

而binder设备向应用程序回消息已BR_开头。在IPCThreadState的构造中保证一个线程有一个该对象,并且每个对象中有一个mIn和mOut,mIn用来接收binder的数据,

mOut用来存储发往binder的数据,wirte的时候即发送成功,与文件的流读写模式是一样的。

startThreadPool和joinThreadPool

创建线程池,加入线程池,startThreadPool最终会调用joinThreadPool,所有都在joinThreadPool中处理。startThreadPool中新启动的线程talkWithDriver读取binder设备,主线程也talkWithDriver读取binder设备。

服务总管:serviceManager

main函数中先打开binder设备,再将该设备的handle设置为0,成为manager,最后处理客户端发来的消息binder_loop函数,该函数主要注册服务。因此ServiceManager集中管理系统内的所有服务。

以mediaPlayerService为例:

一个Client要想获取某个Service的信息,通过ServiceManager的getServer函数,返回一个Binder,再将Binder转化为BpMediaPlayerService,addService之后,等待结果。如果此时收到一个请求消息,即talkWithDriver中有消息,则通过BnMediaPlayerService的onTransact函数实现,此时BpMediaPlayerService为加入服务后监听使用,而

BnMediaPlayerService继承BBinder,为接收到数据时使用。

你可能感兴趣的:(framework 之Bindle深入)