Binder机制是什么:

Binder机制是​ Android系统中进程间通讯(IPC)的一种方式,Android中ContentProvider、Intent、aidl都是基于Binder。

为什么要用Binder机制:

在提及Binder之前,我们先看看我们平时开发的app的状况。每个app就像孤岛一样,生活在系统分配给自己的虚拟机和内存空间,好处是安全,各个app不会互相影响到对方,IE一个网页的崩溃却会导致整个IE应用程序死亡(举个小栗子,IE不属于跨进程)。在这种情况下,必须有一种机制,提供安全高效的通信的功能,Binder就为此而生。所以,Binder是Android系统的一种IPC(进程间通信)方式。ActivityManagerService、WinderManagerService等系统服务的背后都是Binder。

Binder机制的好处:

进程通信大概就两个方面因素,一者性能方面,传输效率问题,传统的管道队列模式采用内存缓冲区的方式,数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程,而socket都知道传输效率低,开销大,用于跨网络进程交互比较多,共享内存虽然无需拷贝,但是不安全。
总结一下就是:
Binder机制优点:
1、只需要进行一次数据拷贝,性能上仅次于共享内存
2、基于C/S架构,职责明确,架构清晰,稳定性较好
3、为每个App分配UID,UID是鉴别进程身份的标志,安全性较好

二者这是安全问题,Android作为一个开放式,拥有众多开发者的的平台,应用程序的来源广泛,确保终端安全是非常重要的,传统的IPC通信方式没有任何措施,基本依靠上层协议,其一无法确认对方可靠的身份,Android为每个安装好的应用程序分配了自己的UID,故进程的UID是鉴别进程身份的重要标志,传统的IPC要发送类似的UID也只能放在数据包里,但也容易被拦截,恶意进攻,socket则需要暴露自己的ip和端口,知道这些恶意程序则可以进行任意接入。
综上所述,Android需要一种高效率,安全性高的进程通信方式,也就是Binder,Binder只需要一次拷贝,性能仅次于共享内存,而且采用的传统的C/S结构,稳定性也是没得说,发送添加UID/PID,安全性高。

Binder机制的实现:

1、Binder机制的架构
通信采用C/S架构,包含Client、 Server、 ServiceManager 以及 Binder 驱动
在 framework 层进行了封装,通过 JNI 技术调用 Native(C/C++)层的 Binder 架构
在 Native 层以 ioctl 的方式与 Binder 驱动通讯

2、Binder机制的实现
android中提供了Binder实体类,Binder 实体是 Server进程 在 Binder 驱动中的存在形式。
该对象保存 Server 和 ServiceManager 的信息(保存在内核空间中),Binder 驱动通过 内核空间的Binder 实体 找到用户空间的Server对象,注册服务后,Binder驱动持有 Server进程创建的Binder实体。
流程总结:客户端通过bindService,通过Binder驱动查询ServiceManager是否已经注册该服务,
如果没有注册,Service进程会想Binder驱动发起服务注册请求,一旦注册,调用该服务的onBind返回一个Binder对象到Binder驱动,已经注册则意味着Binder驱动内包含这个Binder对象,Binder驱动返回一个BinderProxy对象,并通过回调,传递给客户端,客户端通过这个BinderProxy(在java层仍然是Binder对象)操作Binder驱动内的Binder对象(transact方法),Binder驱动含有很多的Binder对象,它们是通过InterfaceToken区分不同服务的。

Binder通信的四个角色

Client进程:使用服务的进程。

Server进程:提供服务的进程。

ServiceManager进程:ServiceManager的作用是将字符形式的Binder名字转化成Client中对该Binder的引用,使得Client能够通过Binder名字获得对Server中Binder实体的引用。

Binder驱动:驱动负责进程之间Binder通信的建立,Binder在进程之间的传递,Binder引用计数管理,数据包在进程之间的传递和交互等一系列底层支持。

Binder运行机制


图中Client/Server/ServiceManage之间的相互通信都是基于Binder机制。既然基于Binder机制通信,那么同样也是C/S架构,则图中的3大步骤都有相应的Client端与Server端。

注册服务(addService):Server进程要先注册Service到ServiceManager。该过程:Server是客户端,ServiceManager是服务端。

获取服务(getService):Client进程使用某个Service前,须先向ServiceManager中获取相应的Service。该过程:Client是客户端,ServiceManager是服务端。

使用服务:Client根据得到的Service信息建立与Service所在的Server进程通信的通路,然后就可以直接与Service交互。该过程:client是客户端,server是服务端。

图中的Client,Server,Service Manager之间交互都是虚线表示,是由于它们彼此之间不是直接交互的,而是都通过与Binder驱动进行交互的,从而实现IPC通信方式。其中Binder驱动位于内核空间,Client,Server,Service Manager位于用户空间。Binder驱动和Service Manager可以看做是Android平台的基础架构,而Client和Server是Android的应用层,开发人员只需自定义实现client、Server端,借助Android的基本平台架构便可以直接进行IPC通信。

关注公众号,获取更多开发必备知识

Android-Binder机制相关推荐

  1. aidl使用_借助 AIDL 理解 Android Binder 机制——Binder 来龙去脉

    AIDL 是 Android Interface Definition Language(Android 接口定义语言)的缩写,它是 Android 进程间通信的接口语言.由于 Android 系统的 ...

  2. 理解Android Binder机制(3/3):Java层

    本文是Android Binder机制解析的第三篇,也是最后一篇文章.本文会讲解Binder Framework Java部分的逻辑. Binder机制分析的前面两篇文章,请移步这里: 理解Andro ...

  3. 理解Android Binder机制(1/3):驱动篇

    Binder的实现是比较复杂的,想要完全弄明白是怎么一回事,并不是一件容易的事情. 这里面牵涉到好几个层次,每一层都有一些模块和机制需要理解.这部分内容预计会分为三篇文章来讲解.本文是第一篇,首先会对 ...

  4. Android Binder机制学习笔记

    声明,学习材料:http://my.unix-center.net/~Simon_fu/?p=875,不是简单的copy 1    Android的进程间通讯机制(IPC)用的是自己的binder机制 ...

  5. Android - Binder机制 - Binder框架总结

    以下几篇文章是较深入分析binder机制. 目录 1. Android - Binder机制 - ServiceManager 2. Android - Binder机制 - 普通service注册 ...

  6. Android Binder机制情景源码分析之Binder回调注册和反注册

    我们在日常开发中,经常用到Binder来进行跨进程通信,有个比较常见的场景是向服务端注册Binder回调,比如: IActivityManager中有两个成对的方法,Client端向AMS所在的服务端 ...

  7. android binder机制之——(创建binder服务)

    Binder机制编程 前面的几篇文章具体介绍了android中binder机制的方方面面,相信你对binder机制已经有了较深刻的理解.俗话说得好"学以致用",以下我们就通过在an ...

  8. Android Binder机制(1501210451 张志康)

    本文主要分析native层和Java层的Android binder通信机制. binder是Android最为常见的进程通信机制之一,其驱动和通信库是binder的核心,分别由C和C++编写,应用程 ...

  9. Android Binder机制----实现自定义的系统服务

    一.基于源码分析Binder机制: Binder机制是Android系统中实现跨进程通信(IPC)的一种重要机制.可以说,Binder机制在android系统中无处不在,所以,要研究android源码 ...

  10. 从AIDL一窥Android Binder机制

    Binder机制在Android系统中地位毋庸置疑,system_server就通过Binder来实现进程间的通信,从而达到管理.调用一系列系统服务的能力.本文就AIDL来解读一下Binder机制的. ...

最新文章

  1. 中秋将至,联合几个号主送出价值500元的中秋大礼包
  2. 几种开源分词工具的比較
  3. qq邮箱格式的Java代码_Java实现QQ邮件发送
  4. android 市场自动安装软件,Android 应用中跳转到应用市场评分示例
  5. 自制CSDN博客评论邮件提醒
  6. 并发编程-volatile和synchronized的区别
  7. PHP的Composer:命令 符号 区别
  8. 两篇同年硕士论文高度雷同!电子科技大学回应:启动调查!
  9. switch最大选项数目_随时随地学习C语言之3—if和switch哪个效率高?
  10. 浅谈 Linux API的交互式运行环境ipython是最好的REPL
  11. 你可能不知道的Spring Boot那点事
  12. 【原】使用Bmob作为iOS后台开发心得——查询关联关系(BmobRelation)
  13. Python 打开目录与指定文件
  14. 利用D3D抓取GPU数据
  15. Java同步数据结构之ConcurrentLinkedDeque
  16. neo4j中心度算法(Centrality algorithm)-3.Closeness Centrality algorithm
  17. android 屏幕亮度代码,android 设置系统屏幕亮度
  18. Autumn中文文档4:响应客户端结果
  19. SAP 记账凭证 更改 冲销
  20. Css Gird网格布局详细介绍

热门文章

  1. Delphi TStringList的用法
  2. matlab中如何定义数组,matlab中如何定义一个数组为全局变量?
  3. GB 9706.1-2020| IEC 60601-1附录A关于条款6.3 的IP2X解释可能有错误
  4. ddm模型公式_绝对估值法DDM、DCF模型和RNAV简介
  5. 黑金花大理石_不同产地的黑金花大理石有哪些特点?
  6. vue 登录页背景-粒子特效(Vue-Particles)
  7. android 动画编辑器,开机动画编辑器 BootanimationEditor
  8. 零基础Python完全自学教程:1.认识python
  9. 爬虫 京东登录协议分析
  10. Python操作Excel制作可视化数据图,实现自动化办公