Android 6.0
Android Binder用来管理Android进程,用途有两个:
1、IPC(Inter Process Communication)工具,用于进程间通信。
2、RPC(Remote Procedure Call)远程函数调用,使得当前进程调用另一个进程的函数就像调用自身的函数一样。当然,她也属于IPC范畴。
关于Binder的历史、驱动实现、在Android中的框架实现等内容,参考结尾列出的极好的资料;这里通过Camera服务的实现、使用,熟悉一个本地服务(C服务)的创建。
一个Binder服务大体来说由3个角色构成:
1、服务接口
2、服务实现
3、服务代理
以Camera服务为例,她们之间关系如下图:
Camera服务接口
服务接口声明某个服务需要实现的功能函数,这里只负责声明,然后在服务和代理中实现。比如上图Camera服务的getCameraInfo()函数。
static sp<IBinder> asBinder(const IInterface*);
接口中的asBinder()函数将服务接口类型转换为IBinder类型,作用是在进行Binder IPC通信时,IBinder对象需要保存到RPC数据中传递给Binder驱动。
asInterface()函数由宏DECLARE_META_INTERFACE/IMPLEMENT_META_INTERFACE生成,用于将IBinder转化为服务接口:
android::sp<ICameraService> ICameraService::asInterface(const android::sp<android::IBinder>& obj)
{
android::sp<ICameraService> intr;
if (obj != NULL) {
intr = static_cast<ICameraService*>(
obj->queryLocalInterface(
ICameraService::descriptor).get());
if (intr == NULL) {
intr = new BpCameraService(ob