Binder机制

一、Binder的由来?

android的底层使用的是Linux内核,而Linux为了保证系统的稳定性,使用了进程隔离的机制,让不同的进程运行在不同的虚拟地址空间中,这样就可以防止两个进程A篡改进程B的数据。但是有时候我们也需要两个进程之间进行通信,比如很多时候我们app就需要调用我们系统的服务,但是两者是在不同的虚拟空间的,这时候就需要使用Binder机制来让两者建立联系。所以,Binder机制的出现是为了让两个进程之间可以实现通信。

二、Binder是如何实现进程间的通信的?

在回答Binder的通信机制之前,我们必须要了解四个重要的概念:

  • server:提供服务的对象
  • client:需要获取服务的对象
  • serviceManager:服务的管理者,本质上也是一个server
  • Binder驱动:C/S联系的中介

实现机制:

  • 服务注册:每一个提供服务的server都会通过binder机制将自身注册到serviceManager中
  • Binder驱动和Server通信:Binder驱动为了和server进行通信,它做了两件事:
    • 为每一个server在内核空间里建立了一个binder节点;
    • 为每一个节点分配一个大于0的句柄,然后Binder驱动将服务的名字以及分配给它的句柄一起发送到serviceManager中。
  • Binder驱动和client通信:
    • client要想和server通信,首先要知道server的名字;
    • 在知道了服务的名字以后,client会把这个名字以及一个句柄为0的值封装成一个数据包,发送给Binder驱动;
    • Binder驱动一看,这个句柄为0,它就会把这个数据包发送给serviceManager;
    • serviceManager在接收到这个数据包以后,就会根据名字来寻找它里面有没有client想要的server,如果有,那么它就会把这个server的大于0的句柄发送给Binder驱动;
    • Binder驱动再把这个句柄发送给client;
    • 这样client就拿到了目标server的句柄,然后client就用现在这个目标server的句柄外加server的名字,再封装成一个数据包,发送给Binder驱动,驱动再发送给serviceManager,这样就可以找到对应的server实现通信了。

说起来可能非常繁琐,总结一下其实很简单:
1、所有的server注册到serviceManager中;
2、Binder驱动为server创建节点,分配句柄;
3、client想要什么服务就通过Binder驱动拿到对应服务的句柄,用句柄去serviceManager中去寻找对应的服务,当然获取句柄,获取服务都是要通过Binder驱动的,client不能直接对server进行访问,因为Linux内核有进程隔离机制啊,这样应该很清楚了吧。

三、关于ServiceManager的一点补充

刚才我们也说了serviceManager本质上也是一个server,那这么多server到底哪一个可以成为管理者呢?

  • server也是一个进程,这个进程会打开“/dev/binder”设备文件,映射内存;
  • 然后通过“BINDER_SET_CONTEXT_MGR”命令告诉Binder驱动,让自己成为上下文的管理者,这样这个进程就成为了serviceManager;

四、为什么要使用Binder?

其实安卓中已经有非常多的通信模型了,比如管道、报文队列、插口等等,那为什么还要选择Binder呢?

  • 安全,每一个进程都会由系统分配UID和PID,不像传统的在数据中添加UID的形式,这样那些恶意的进程就无法和其他进程进行通信,保证系统的安全;
  • 高效,Binder实现通信的时候,只需要拷贝1次数据,而其他的比如socket需要拷贝2次,这样也节省了手机内存。

好了,对于binder机制的面试题就总结这么多了,如果有补充,后续还会更新,同样的,欢迎大家留言告诉我你们在面试过程中遇到的有关binder的面试题~~~

千里马8年Android系统及应用开发经验,曾担任过美国unokiwi公司移动端技术总监兼架构师,对系统开发,性能优化,应用高级开发有深入的研究,Android开源定制ROM Lineage的贡献者之一,国内首家线下开辟培训Android Framework课程,拥有2年的Android系统培训经验。成为腾讯课堂专业负责android framework课程分享第一人,致力于提高国内android Framework水平Android Framework领域内是国内各大手机终端科技公司需要的人才,应用开发者都对Android系统充满着好奇,其中的binder是重中之重,都说无binderAndroidbinde是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、付费专栏及课程。

余额充值