本章关键点总结 & 说明:
上面的导图描述了Binder框架中主要几个部分,同时本章节主要通过Bctest的案例 对Binder原理进行简单说明。
binder系统概述:Binder系统是一种基于IPC的RPC (远程过程调用) 通信机制
android为什么要引入binder通信机制?
- Binder使用Client-Server通信方式
- 安全性好,简单高效
- 面向对象的设计
- 独特的接收缓存管理和线程池管理方式
这里从C层的binder进行分析,因为这是android原生系统给出的案例,因此就从这里开始分析。实际上无论从哪里分析,原理都是一样的,从servicemanager启动,到服务端注册服务,再到客户端获取服务,无非是在这里面添加了框架,以及C++和Java层,让我们感觉很多地方云里来雾里去。但实际上Binder就是一个通信机制。本节 抛开框架,简单说下binder的原理。
1 从C测试程序开始Binder系统的学习
首先从Binder系统的C程序开始说起,文件位置在frameworks/native/cmds/servicemanager
1.1 Android Binder系统整体简要框架
这里关注了整体流程,下面是servicemanager运行流程:
//service_manager运行流程,service_manager.c :
a. binder_open
b. binder_become_context_manager
c. binder_loop(bs, svcmgr_handler);
c.1 res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);
c.2 binder_parse
// 解析
// 处理 : svcmgr_handler
SVC_MGR_GET_SERVICE/SVC_MGR_CHECK_SERVICE : 获取服务
SVC_MGR_ADD_SERVICE : 注册服务
// 回复
下面是 服务端 服务注册流程:
//bctest.c,注册服务的过程:
a. binder_open
b. binder_call(bs, &msg, &reply, 0, SVC_MGR_ADD_SERVICE)
// 含有服务的名字
// 它会含有servicemanager回复的数据
// 0表示servicemanager
// code: 表示要调用servicemanager中的"addservice函数"
下面是 客户端获取服务流程:
//获取服务的过程:
a. binder_open
b. binder_call(bs, &msg, &reply, target, SVC_MGR_CHECK_SERVICE)
// 含有服务的名字
// 它会含有servicemanager回复的数据, 表示提供服务的进程
// 0表示servicemanager
// code: 表示要调用servicemanager中的"getservice函数"
1.2 明确2个概念IPC与RPC
@1 IPC : Inter-Process Communication, 进程间通信
三个关键要素:源(source)、数据(data)、目的(target),如下所示:
对于binder系统来讲
假设源是服务端A,目的是ServiceManager;A向ServiceManager发送数据,表示注册服务的IPC流程
假设源是客户端B,目的是ServiceManager;B向ServiceManager发送数据,表示查询并获取服务handle的IPC流程
IPC