Android binder 理解
前言
binder对于android开发的同学来说既陌生又熟悉,但是要真正理解还是需要进一步深入的了解它的原理
一、IPC,RPC理解
IPC Inter-Process Communication字面理解就是进程通信,简单来说就是两个进程之间交互信息的通道,负责数据的传输。 简单示意图:
RPC Remote Procedure Call远程过程调用,而不是直接通信,但是也依赖于IPC之上来建立通信。 如图我们可以这里理解类似进程A操控硬件依赖IPC通道进行数据传输给B控制的硬件,该硬件进行数据的接受方的这一过程称之为RPC
二、IPC数据传输组成
如下图: 数据组成一般分为三部分 一、源,就是发送方这里是进程A 二、目的,就是让接收方收到,这里就需要让进程B在ServiceManager里注册服务以便于进程A在ServiceManager里面搜索到这个服务从而获得一个指向进程B的handle 三、数据,一般就是双方约定的数据
三、android中binder模型
在android中可以这样理解进程A就是client,进程B为Server,他们中间有个ServiceManager来注册和查询管理服务,他们通信通过底层binder驱动 接下来我们来看一下各个进程需要干的活,这个和之前分析的基本一致
四、android源码结合认知过程
在源码里可以去native\cmds\servicemanager里查看 service_manager.c、bctest.c、binder.c这几个c文件中可以进行验证。 service_manager.c里面流程解析
binder_open
binder_become_context_manager
binder_loop(bs,svcmgr_hander)
ioctl 读取数据
binder_parse 解析数据
处理方法:svcmgr_hander通过传入的code进行注册或者查询获得相应发服务操作
bctest.c里面流程解析 注册服务
binder_open
binder_call(bs,&msg,&reply,target,SVC_MGR_ADD_SERVICE)
获取服务
binder_open
binder_call(bs,&msg,&reply,target,SVC_MGR_CHECK_SERVICE)
发现注册和获取服务所调用的方法其实是一样的只是行为目的不一样所以传的参数和返回值不同而已
总结
看了源码以后也基本验证的了所有进程执行的逻辑和流程,接下来就是对cs怎么具体进行通信写一个实际的例子进行应用学习
|