Binder机制

Binder机制

目录

  1. Binder是什么
  2. Binder通信机制
    1. Binder驱动
    2. Service Manager
    3. Binder机制跨进程通信流程
  3. 总结

先给出Android中的Binder的工作机制图

image

我们在上一篇文章讲解了AIDL生成的Java文件,我们知道AIDL的实现是依赖与Binder机制的,此篇就简单讲解Binder机制。

Binder是什么

要说Binder就不得不提到Linux,毕竟Android底层是Linux,但是为什么Android并没有用Linux常用的IPC机制,而是新创建了快速的、轻量级的、更适用小型设备的Binder机制,因为Linux的IPC机制无法做到足够轻量,较Binder会产生更多的性能消耗,所以Binder就在这中环境下应运而生。

借用《Android 开发艺术探索》对Binder的概括

  • 从代码角度来看,Binder是一个实现了IBinder接口的类
  • 从来源看,Binder来自于OpenBinder,是Android IPC机制中的一种,Binder还可以理解成一个虚拟物理设备,设备驱动是dev/binder;
  • 从Framework层看,Binder是Service Manager连接各种Manager(ActivityManager,PackageManager…)和相应Service (ActivityManagerService, PackageManagerService…)的桥梁;
  • 从客户端看,Binder是客户端服务器通讯的媒介

Binder通信机制

image

一个完整的Binder机制中有四个元素组成,
- client,客户端
- Server,服务端
- Binder device,Binder驱动,Binder机制的核心
- Service Manager,服务管理类,内部持有所有的服务IBinder服务

Binder驱动

image

驱动程序一般指的是设备驱动程序(Device Driver),是一种可以使操作系统和硬件通信的特殊程序。类似硬件的接口,操作系统只有通过这个接口才能与硬件通信。

在Linux系统中,有用户空间和内核空间两种内存空间

  • 用户空间:应用程序运行的空间
  • 内核空间:系统内核和驱动运行的空间

用户空间不能直接访问内核空间,需要通过System Call Interface(系统调用接口),内核对这个接口进行管理,防止用户程序对系统资源的越权访问,保障了系统的安全和稳定。同样的进程之间也不能直接访问需要经过内核空间进行中转。

在一个跨进程访问种Binder驱动做了下面两件事,实现数据的中转。

  1. Client将数据从用户空间拷贝到内核空间
  2. Binder驱动将拷贝到内核空间的数据拷贝到Server所在的用户空间

这就是Binder机制的根本原理

Service Manager

Server的管理类,负责对Server端的管理,持有所有Server端,类似AMS

Binder机制跨进程通信流程

直接上图
image

Binder实体
  • 每个Server都可以看成一个Binder实体,持有Server和ServiceManager的信息
  • 驱动通过Binder实体中保存的Server信息,就可以找到在用户空间中对应的Server
Binder引用
  • Binder实体的引用,是内核中Binder_ref的实例,在内核中通过Biner引用就可以找到对应的Binder实体,类似C的指针都是指向某一个内存空间

Binder跨进程通信步骤:

  1. 初始化
    • ServiceManager初始化,ServiceManager会和Binder驱动通信,将自己的引用给ServiceManager
    • Binder驱动利用ServiceManager的引用新建ServiceManager实体
  2. 注册
    • Server启动时向驱动发起注册请求,驱动为其创建Binder实体
    • 驱动通知ServiceManager进行注册,如果ServiceManager的引用表中没有此Binder引用,就将其名称和Binder引用添加到引用表,此处的名称就是Binder.attachInterface中传入的descriptor
  3. 获取
    • Client请求驱动获取某一名称的Binder引用,驱动将请求交给ServiceManager处理
    • ServiceManager根据传入的名称查询引用表,如果有对应名称的Binder引用就通过驱动反馈给Client
    1. Client根据反馈的Binder引用,创建对应的远程服务代理
  4. 发送
    • Client调用远程服务代理,远程服务代理与驱动Server进行通信
    • 驱动通过远程服务代理中已有的Server的Binder引用找到对应的Server,将Client的请求发送给Server

总结

简单来说,用户空间的每一个进程对应一个JVM,而每一个JVM都会单独的开辟内存空间,两个JVM之间是不能直接进行通信的,必须通过内核进行中转,Binder驱动就是起到这个中转作用,这完全保证了Android的C-S架构,保障了系统安全,当C进行请求时经过Binder驱动,Binder驱动找到对应的S,S处理请求之后通知Binder驱动,Binder驱动将处理结果反馈给C,这就是一次完成的请求响应过程。

此篇只是简单的阐述了一下Binder机制的应用层的原理与逻辑,更深入的内容需要大家共同的深入研究。

最后推荐一下,http://wangkuiwu.github.io/categories/

致敬源码

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

余额充值