Android系统binder原理分析

1.举个例子

binder系统的核心有两个
IPC和RPC

IPC:进程间通讯,比如说A进程想把数据原原本本的发给B进程,这之间就涉及IPC

RPC:远程间调用,比如A进程想去打开led,他会调用led_open,然后调用led_ctl,但是他并没有权限打开驱动程序,他会怎么办呢?

1.他会封装数据,或者构造数据
2.发送给B,怎么发送,就是通过IPC通道发送给B进程
3.B进程收到以后,取出数据
4.然后B调用自己本地的led_open和led_ctl

数据传输有三大要素:
1.源
2.目的
3.数据本身

在我们的例子中,源就是进程A,目的就是进程B,现在问题来了,进程A怎么知道是进程B提供led的访问,如果进程A想操纵声音,他应该给哪个进程发送数据?
所以这里就会引入两个东西:
1.进程B向所谓的service manager注册服务led服务
2.进程A向service manager查询服务有没有led服务,得到一个handle,这个handle就是指向进程B

数据就是双方约定好的一个buf

对于binder系统,涉及到四个东西
1.A,就是client
2.B,就是server
3.A怎么知道向哪一个B发送数据,中间就引入了一个service manager
4.他们之间的通讯是通过binder驱动实现的

再看RPC:远程过程调用,认为是调用其他进程的某个函数就可以了
1.调用哪个函数:server的函数编号
2.传给它什么参数:通过IPC的buf传输
3.返回值

现在,我们看看具体的调用过程,在android源码包里面,有一些用c语言写的binder应用程序,我们可以参考他理解这整个调用过程。
源代码在这个目录里面:
http://androidxref.com/9.0.0_r3/xref/frameworks/native/cmds/servicemanager/
1.里面有一个service_manager.c
2.还有一个半成品bctest.c
3.还有一个封装好的c库binder.c

以后我们会根据这个半成品bctest.c,写出我们的client程序和server程序
现在我们先大概猜测一下,这个client,sever,servicemanager分别做什么事情

2.流程分析

我们之前那说过,首先server要向service manager注册一个服务,首先运行的肯定是service manager

1.第一步干嘛呢?应该去open binder驱动
2.告诉驱动程序,它就service manager
3.应该是一个while循环
	a.读驱动获取数据,别人没有给他发数据的时候就休眠
	b.读到数据后就解析数据
	c.并且调用两个函数
		c1.注册服务:首先server可能会向你注册服务,那么就在连表中记录名字
		c2.获取服务:注册服务以后,client有可能会向你发出数据,想获得某个服务
		c2a:在链表中查询有无服务
		c2b:返回“server进程”的handle

再看看server会做什么事情

1.打开驱动程序
2.注册服务
	a.向service manager发送服务的名字
3.while(1)循环,既然是一个服务,就要等待客户端给你发送数据,让你去解析这些数据来调用你的函数
	a.读驱动获取数据,没有数据的时候就休眠
	b.解析数据
	c.调用对应的函数

再看看client

1.open 驱动
2.获取服务:我想把数据发送给服务进程,我发送给谁呢?
	a.首先,我要向service manager查询,得到一个handle,
	b.以后我就知道 ,我可以把数据发送给handle,这个handle对应这个服务进程
3.向handle发数据,最终会导致server读取到数据,他就会解析数据,然后调用他本地的函数,来实现他硬件的操作等等

我们分析了这整个调用过程,但是有个细节我们要留意一下,server注册服务的时候也要向其他进程发送消息,他要向service manager发送消息,他怎么知道service manager是谁?client他要获取服务,他也要向service manager发送消息,那么这个service manager是谁?所以,servicemanager本身要告诉驱动程序,它就service manager。
在这里插入图片描述

3.结合源码验证猜测

看看源代码,验证我们分析的对不对
http://androidxref.com/9.0.0_r3/xref/frameworks/native/cmds/servicemanager/service_manager.c
在这里插入图片描述

http://androidxref.com/9.0.0_r3/xref/frameworks/native/cmds/servicemanager/bctest.c
在这里插入图片描述

由于bctest是个半成品,所以只能分析到这里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
千里马8年Android系统及应用开发经验,曾担任过美国unokiwi公司移动端技术总监兼架构师,对系统开发,性能优化,应用高级开发有深入的研究,Android开源定制ROM Lineage的贡献者之一,国内首家线下开辟培训Android Framework课程,拥有2年的Android系统培训经验。成为腾讯课堂专业负责android framework课程分享第一人,致力于提高国内android Framework水平Android Framework领域内是国内各大手机终端科技公司需要的人才,应用开发者都对Android系统充满着好奇,其中的binder是重中之重,都说无binderAndroid,binde是Android系统的任督二脉。课程水平循序渐进,由中级再到高级,满足各个层次水平的android开发者。1、灵活使用binder跨进程通信,在app端对它的任何api方法等使用自如2、可以单独分析android系统源码中任何binder部分,分析再也没有难度3、掌握binder驱动本质原理,及对应binder驱动怎么进行跨进程通信,及内存等拷贝方式数据等4、对binder从上层的java app端一直到最底层的内核binder驱动,都可以顺利理通5、针对系统开发过程中遇到的binder报错等分析方法,及binder bug案例学习6、针对面试官任何的binder问题都可以对答自如7、socket这种跨进程通信实战使用8、针对android源码中使用的socket源码轻松掌握9、android系统源码中最常见的socketpair中双向跨进程通信10、使用socket实现一个可以让app执行shell命令的程序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值