资源描述:
《binder深入讲解底层内核实现》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、第一节AndroidBinder星期四,06/17/2010-00:03—williamAndroidBinder是一种在Android里广泛使用的一种远程过程调用接口。从结构上来说AndroidBinder系统是一种服务器/客户机模式,包括BinderServer、BinderClient和AndroidBinder驱动,实际的数据传输就是通过AndroidBinder驱动来完成的,这里我们就来详细的介绍AndroidBinder驱动程序。通常来说,Binder是Android系统中的内部进程通讯(IPC)之一。在Android系统中共有三种IPC机制,分别是:-标准
2、LinuxKernelIPC接口-标准D-BUS接口-Binder接口尽管Google宣称Binder具有更加简洁、快速,消耗更小内存资源的优点,但并没有证据表明D-BUS就很差。实际上D-BUS可能会更合适些,或许只是当时Google并没有注意到它吧,或者Google不想使用GPL协议的D-BUS库。我们不去探究具体的原因了,你只要清楚Android系统中支持了多个IPC接口,而且大部分程序使用的是我们并不熟悉的Binder接口。Binder是OpenBinder的Google精简实现,它包括一个Binder驱动程序、一个Binder服务器及Binder客户端(?)。
3、这里我们只要介绍内核中的Binder驱动的实现。对于AndroidBinder,它也可以称为是Android系统的一种RPC(远程过程调用)机制,因为Binder实现的功能就是在本地“执行”其他服务进程的功能的函数调用。不管是IPC也好,还是RPC也好,我们所要知道的就是AndroidBinder的功能是如何实现的。Openbinder介绍2.1.1AndroidBinder协议Android的Binder机制是基于OpenBinder(http://www.angryredplanet.com/~hackbod/openbinder/docs/html/BinderI
4、PCMechanism.html)来实现的,是一个OpenBinder的Linux实现。AndroidBinder的协议定义在binder.h头文件中,Android的通讯就是基于这样的一个协议的。·BinderType(描述bindertype的功能)Android定义了五个(三大类)Binder类型,如下:enum{BINDER_TYPE_BINDER=B_PACK_CHARS('s','b','*',B_TYPE_LARGE),BINDER_TYPE_WEAK_BINDER=B_PACK_CHARS('w','b','*',B_TYPE_LARGE),BINDER
5、_TYPE_HANDLE=B_PACK_CHARS('s','h','*',B_TYPE_LARGE),BINDER_TYPE_WEAK_HANDLE=B_PACK_CHARS('w','h','*',B_TYPE_LARGE),BINDER_TYPE_FD=B_PACK_CHARS('f','d','*',B_TYPE_LARGE),};·BinderObject进程间传输的数据被称为Binder对象(BinderObject),它是一个flat_binder_object,定义如下:structflat_binder_object{/*8bytesforlarge_
6、flat_header.*/unsignedlongtype;unsignedlongflags;/*8bytesofdata.*/union{void*binder;/*localobject*/signedlonghandle;/*remoteobject*/};/*extradataassociatedwithlocalobject*/void*cookie;};其中,类型字段描述了Binder对象的类型,flags描述了传输方式,比如同步、异步等。enumtransaction_flags{TF_ONE_WAY=0x01,/*thisisaone-waycall
7、:async,noreturn*/TF_ROOT_OBJECT=0x04,/*contentsarethecomponent'srootobject*/TF_STATUS_CODE=0x08,/*contentsarea32-bitstatuscode*/TF_ACCEPT_FDS=0x10,/*allowreplieswithfiledescriptors*/};传输的数据是一个复用数据联合体,对于BINDER类型,数据就是一个binder本地对象,如果是HANDLE类型,这数据就是一个远程的handle对象。该如何理解本地binder