Binder 核心原理分析(一)


1. 什么是 Binder?

Binder 是 Android 中特有的一种跨进程通信方式,它模糊了进程的边界,淡化了进程通讯的一个过程,它让争个系统仿佛运行在一个 OOP–面向对象 的程序当中。

Binder 彷佛是粘结各个应用程序的胶水一样,它无处不在。并且 Android 为了向应用开发者提供各种各样丰富的功能,这种通信的方式更是无处不在,eg: 媒体的播放,音视频的捕获,各种传感器

Server 端提供各种功能,应用程序也就是 Client 端与这些服务端建立链接后就可以轻松的使用这些服务。

在这里插入图片描述

2. Binder 简单例子

在这里插入图片描述

3. Binder 由来

3.1 传统 Linux 提供的进程间通讯方式优劣

原来 Linux 内核提供了很多进程间的通讯,eg: socket, 管道, 内存共享 …

  • 管道通常指半双工管道 (只允许数据在某一个方向上传输)
    • 管道如何通讯的呢? 进程 A 创建再打开管道,进程B打开管道,然后进程A向管道写数据,进程B从管道读数据。进程A不停的向管道写数据,进程B不停的从管道读数据,写完之后进程A关闭管道,进程B再关闭管道,最后删除管道。所以相对耗费性能
  • 共享内存
    • 使多个进程可以访问同一块内存空间,但是管理非常混乱。(医生就在医院门口诊断,但是大家都来找他,相对很混乱)
  • socket
    • 适合网络通讯,用在这里杀鸡用牛刀的感觉
      在这里插入图片描述

3.2 传统管道通信

进程A – 进程B 的通信可以简单看作 C/S 架构, 进程B可能是传感器之类的需要向多个进程提供服务,所以我觉得可以看作 Server。

进程间是不可以通信,但是内核空间是可以共享的。两次 copy

在这里插入图片描述

3.3 所以 Android 为什么用 Binder 做为进程间通信机制呢?

  • 安全新比较高
    • 它从通信协议本身就支持通信双方做身份校验,
      在这里插入图片描述

4. Binder 四个重要角色

  • Server, Client, ServiceManger 属于用户空间,用户空间不能进程间通讯

  • Binder 驱动属于内核空间,这个可以进程间共享空间

  • ServiceManger 属于 Client 和 Server 之间的桥梁

  • Client 可以通过 ServiceManger 拿到 Server 中 Binder 实体的引用

  • 一个 Server 如果需要给其它 Client 提供服务的话,必须要通过 ServiceManger 注册相应的信息,即把相应的 Binder 的引用注册到 ServiceManger 中。 Client 想要得到特定的服务的话,必须通过相应的 key 从 ServiceManger 找到 Server 中 Binder 的引用

Android 中很多系统服务都是通过 Binder 去和 AMS 进行交互,比如获取系统音量: content.getSystemService(Context.AUDIO_SERVICE)
在这里插入图片描述

4.1 Binder驱动 和 Binder

Binder驱动 是负责进程之间 Binder通信的建立,Binder 在进程之间是用于通信的,他们是用去传递消息的,由于他们之间是没办法直接交互的,都是通过一个 Binder驱动 来进行交互。

Binder驱动 有它的一个线程池,因为它有可能是并发。有多个需求方可能用同一个服务或者多个服务,这时候就会有很多 Binder驱动的交互,从而需要这么一个线程池。

一个进程的 Binder线程数默认最大是16,超过会被阻塞,等待空闲

在这里插入图片描述

5. Binder 四个重要对象

  • IBinder
    • 一个接口,代表了跨进程通讯的能力、功能
    • 实现这个接口,该对象就可以进行跨进程传输了
  • IInterface
    • 代表了 Server 进程具备什么样的功能,什么样的能力,能提供哪一些方法,对应 AIDL 的接口
  • Binder
    • Java 层的 Binder 类,代表了 Binder 的本地对象,BinderProxy. 通过本地的代理 BinderProxy 来进行操作,copy_from_user
    • 不是很懂,回头再细看
    • 继承自IBinder
  • Stub
    • AIDL 的时候编译工具自动给我们生成的一个Stub 静态内部类
    • 这个类继承了Binder, 是一个Binder的本地对象
    • 实现了 IInterface接口,表面它具备服务端承诺给客户端的一个能力
    • 这是一个抽象类,具体 IInterface 实现需要开发者自己实现

5. Binder 通信机制流程

-Binder Driver and Service Manager 由系统提供
-Client and Server 由应用程序提供

在这里插入图片描述
在这里插入图片描述

6. Binder 架构设计

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值