基本上所有的Android源码分析第一个需要了解就是这个玩意了。基本上也就是一句话就可以概括Binder:一个实现进程间通信(IPC)的驱动程序。本小片不是分析Binder是如何实现的,而是怎么用的。    IPC的目的就是让进程A能访问并使用进程B的函数(方法)。如果我们暂时不去管“进程”这个概念的话,就变成了模块之间的函数调用。那其实就变得很简单了。将模块B编译成B.lib,再写一个B.h文件申明函数接口。模块A中就可以访问模块B的函数了。
    由于进程之间的内存边界保护等原因使进程间函数调用变得稍复杂一些。于是就有了IPC通信机制,进程A告诉进程B想要干什么。进程B完成相关的操作再把结果告诉进程A。    呃,看来真得老了,废话还真多。假设我们做了个进程来测量运行速度(进程B),另外有一个Activity显示给用户看(假设在另外的进程中)。
1. 申明函数接口(相当于B.h文件):
class ISpeed: public IInterface
{
    ...
    virtual double getCurrentSpeed();
};2. 进程B中要实现一个类完成相关的操作:
class BnSpeed: public BnInterface<ISpeed>
{
...
};3. 进程A(Activity所在的进程)要实现一个代理类:
class BpSpeed: public BpInterface<ISpeed>
{
};    那么Activity中调用BPSpeed::getCurrentSpeed();就可以访问并使用了进程B中的函数getCurrentSpeed()了。其实这种BnXXXX, BPXXXX, IXXXX的设计完全是一种封装,让我们访问其他进程中的函数就和调用进程内的函数一样方便简单!~~~    举例:CameraClient定义了3个类:ICameraClient, BnCameraClient 和 BpCameraClient来实现CameraClient和CameraService这间的IPC访问的。
CameraService 有个Client类,而成员变量mClient[MAX_CAMERAS] 而MAX_CAMERAS=2,估计是表示手机的一前一后的摄像头。Client在实例化的时传了个new CameraHardwareInterface进去,这个是用来和Camera驱动打交道的句柄吧。Camera中用到的Binder。 1. ICameraClient 用于CameraService::Client将视频数据准备好或其他事件发生时发送给客户端对象。
所以:Camera.cpp中的Camer需要实现BnCameraClient接口(继承)。 CameraService::Client使用成员变量mCameraClient(BpCameraClient)将事件传递给Camera.cpp.2. ICameraService 接口:CameraService.cpp 实现BnCameraService 接口,那么Camera客户端就可以访问到CameraService的函数connect(), getNumberOfCameras()了。3. ICamera接口:CameraService::Client 实现BnCamera接口, Camera.cpp 中的实例获取到BpCamera对象的引用就可以访问CameraService:Client对象了。
Android源代码ipc