实例分析android中的Binder通信机制(1)

    android是基于linux内核的,所以它也是支持linux常用的通信方式。在android中最常用也是android的通信基础采用的是Binder通信机制。当然,在android中还有使用到其他的通信方式,比如socket。

    在这里,首先要明确的是一定要binder的通信业务和具体的业务层两者区分开,绝对不能搞混它们。

   在android中主要有三个端:client端、Server端和一个全局的ServiceManager端。ServiceManager端是管理系统的各种服务,向这里就是以一个MediaPlayerService为例。当然还有其他的服务。在这里,必须明确的是client端、Server端和一个全局的ServiceManager端这三个分别在3个不同的进程当中。所以说三者之间的通信都是Binder。Server端是许多服务的栖息地, MediaPlayerService只是services之一而已。

 

     Binder通信与C/S架构之间的关系,Binder只是为C/S架构提供了一种通信方式。

    MediaServer的入口函数是一个Main_MediaServer.cpp文件中的Main(),这个函数主要是实现了获得ProcessState实例对象,得到一个BpServiceManager和相关服务内容的初始化工作。在这里,ProcessState对象实例中有一个成员变量mDriver,这个驱动对象利用open_driver()打开了Binder设备。 同时,在这个构造函数中得到这个Binder设备之后,对int fd使用了mmap,这样的话binder驱动就会分配一块内存来接收数据。

 

    IServiceManager这个接口是ServiceManager向外界提供的,所有说由IServiceManager可以获得一个BpServiceManager。IServiceManager对应的文件是IServiceManager.cpp,现在主要分析这个接口中。

重要函数一: defaultServiceManager()

这个函数中首先会创建一个mdefaultServiceManager对象。在这里特别要注意的一个android中最常使用的一个格式转换函数。interface_cast< **** >函数,在这里interface_cast<IdefaultServiceManager >(ProcessState::self() -> getContextObject(NULL));这个函数内容很丰富,首先得到一个BpdefaultServiceManager。然后这个参数,最终会调用到getStrongProxyForhandle()在这里new出一个新的BpBinder,这里的这个BpBinder就是未来用来数据通信的。interface_cast<I####>这个内联的类模板会创建出对应的Bp####。

getContextObject(NULL)最后等价于BpBinder(NULL)而这个NULL是handle的值,handle在这里作为一个名词,是处理的索引,类似于windows中的句柄的作用。handle是一个资源项的值,所有的资源项都保存在一个资源数组中。handle == NULL,这个"0"在整个binder系统中的重要含义是:特别注意::0代表ServiceManager所对应的BBinder。

重要函数二: 一个重要的宏

public:

    DECLARE_META_INTERFACE(ServiceManager);这个宏是在.h中定义的,当然对应的在.cpp中就会实现它。

    IMPLEMENT_META_INTERFACE(ServiceManager);(在.cpp文件中)

    通过这个宏的定义和实现完成了Binder通信业务和服务业务的挂钩。DECLARE中声明了一些重要函数和变量,在IMPLEMENT中就会把它们一一实现。

   说说这个Binder通信业务和服务业务的挂钩的问题:DECLAREIMPLEMENT是在IInterface中完成的,IServiceManager是继承自IInterface,当然就继承了DECLAREIMPLEMENT这两个东西。asInterface()的内容是interface_cast<I####>,这个就得到了BpServiceManager。然后还有的成员变量像一些描述接口的字符串什么的。

 

    在  IServiceManager.cpp中主要是实现BpServiceManager的定义。

     BpServiceManager : public BpInterface<IServiceManager>最终的父类是BpRefBase,

    它的构造函数是BpRefBase(const  sp<IBinder>& o( == remote,它是一个BpBinder))。

 

结论:IServiceManager.cpp中利用defaultServiceManager()函数完成创建一个BpBinder对象,用来实现未来数据的传输。又创建了 BpServiceManager对象

           实现这个通信的Bp业务层。BpServiceManager(remote == BpBinder(NULL))这个参数就可以数据传输了,BnServiceManager,便会是具体的实现。

 

 !!在此,必须特别注意的是:

    interface_cast不是指针的转换,是利用BpBinder作为参数新建一个BpServiceManager对象。

   

 

 

 

你可能感兴趣的:(实例分析android中的Binder通信机制(1))