您的位置:首页 > 移动开发 > Android开发

Android - Binder机制 - 获得普通service

2013-05-08 16:50 411 查看
以下几篇文章是较深入分析binder机制。

目录

1. Android - Binder机制 - ServiceManager

2. Android - Binder机制 - 普通service注册

3. Android - Binder机制 - 获得普通service

4. Android - Binder机制 - client和普通service交互

5. Android - Binder机制 - Binder框架总结

6. Android - Binder机制 - ProcessState和IPCThreadState

7. Android - Binder机制 - 驱动

Android - Binder机制 - 获得普通service

UML及说明



1. Camera是客户端进程,它有一个函数是getCameraService函数,该函数就要获得CameraService服务;

2. Service_manager.c就是第一篇将的ServiceManager,它是另外一个进程,它要通过binder接收该进程的GetService请求,并进行相应处理(第一篇已经讲);

3. IInterface和IServiceManager定义了Camera和ServiceManager之间的功能接口,它是一个抽象类;

4. BpServiceManager和BpInterface继承于IServiceManager,当然就是对功能接口的具体实现;

5. Camera调用BpServiceManager的getService()接口获得服务;

6. IBinder是定义Binder数据传输层的功能接口,它有一个接口transact,做过android的应该都有印象,它也是一个抽象类;

7. BpBinder是对IBinder的具体实现,它是用来进行数据传输的,BpRefBase中的mRemote就是指向的BpBinder,BpRefBase起了一个代理作用,但是BpBinder没有直接和binder打交道,而是通过调用下面的IPCThreadState实现的;

8. IPCThreadState才是和binder进行打交道的类,它才是真正的数据传输者;

9. ProcessState它主要打开binder设备供IPCThreadState使用和获得ServiceManager用来注册服务;

10. 在分析的时候还是先有一个整体把握,这个会在后面详解,BpRefBase以上是业务逻辑(要实现什么功能),BpRefBase以下是数据传输(通过binder如何将功能实现);

11. 以后只要是见到Bpxxx的是在client进程,Bnxxx的是在service进程;

获得服务

1. 通过defaultServiceManager获得BpServiceManager,通过BpServiceManager的getService接口;

2. getService执行remote()->transact(CHECK_SERVICE_TRANSACTION, data, &reply);

3. remote()其实是BpBinder,transact执行IPCThreadState::self()->transact(mHandle, code, data, reply, flags),注意mHandle是0,代表ServiceManager;

4. IPCThreadState::self()->transact执行writeTransactionData(BC_TRANSACTION, flags, handle, code, data, NULL)和waitForResponse(reply),很明显就是发送数据,然后等待响应;

5. writeTransactionData其实并不直接将数据发送到binder驱动,而是将数据写到了mOut缓冲区,mOut是Parcel,该类是封装和驱动交互数据的数据格式(如果精通binder,要清楚这个格式);

6. waitForResponse调用talkWithDriver()获得binder的答复;

7. reply.readStrongBinder(),在Parcel中,binder是一个数据类型,所以readStrongBinder函数可以将reply转为IBinder,而且是BpBinder,其中的mHandle就是刚获得service的handle索引;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: