最近在看韦老师的android binder视频 ,记录下个人对视频学习的理解。
学习需要记录与分享,如果有误,希望得到大家的指正!
IPC:两个进程间数据通信的一种方式
RPC:一个进程调用另外一个进程的方法
比如A进程要调用驱动的 led_open 但是A没有权限。只能通过系统程序的B进程来调用
那么 A 将要调用的方法 调用的参数 发给B ,B获取数据 并解析出来 然后执行led_open函数
那么A如何将数据发给B呢 ?
A怎么找到B呢?这里就引入一个 servicemanager
1.这里binder驱动 就是作为全局的数据传递的IPC服务,它负责将数据在所有进程之间的共享管理
2.进程间通讯 通过注册到binder驱动中的一个handler(整数)来标识
也就是A进程告诉binder 我要向0x123 这个handler的进程发数据,并标志这个buffer的handler为0x123
B进程会轮询0x123所标志的buffer 并从中获取数据
3.servicemanager,的作用相当于一个中间机构,b进程向它注册服务,a进程从它获取服务
b进程向它注册的时候 提供给了一个服务名+b的hander
a进程从它获取服务的时候,可以通过一个服务名找到 b的handler
4.a 怎么找到servicemanage的?
因为servicemanage向binder注册的时候,就声明我是servicemanage,那么binder驱动将指定它的hander是0
我们可以向0的handler发送数据 ,其中code是要访问的方法, binder_io是要访问的参数
frameworks\native\cmds\servicemanager
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 测试文件
注册服务的过程:一般在B进程也就是service进程中调用
a. binder_open
b. binder_call(bs, &msg, &reply, 0, SVC_MGR_ADD_SERVICE)
msg // 含有服务的名字
reply // 它会含有servicemanager回复的数据
0 // 0表示servicemanager
SVC_MGR_ADD_SERVICE // code: 表示要调用servicemanager中的"addservice函数"
获取服务的过程: 一般在A进程也就是client中调用
a. binder_open
b. binder_call(bs, &msg, &reply, target, SVC_MGR_CHECK_SERVICE)
// 含有服务的名字
// 它会含有servicemanager回复的数据, 表示提供服务的进程
// 0表示servicemanager
// code: 表示要调用servicemanager中的"getservice函数"
关键函数binder_call的分析