Binder 是一种进程间通信机制,基于开源的 OpenBinder 实现;OpenBinder 起初由 Be Inc. 开发,后由 Plam Inc. 接手。从字面上来解释 Binder 有胶水、粘合剂的意思,顾名思义就是粘和不同的进程,使之实现通信。

为什么 Activity 间传递对象需要序列化?

Activity 的启动流程是什么样的?

四大组件底层的通信机制是怎样的?

AIDL 内部的实现原理是什么?

插件化编程技术应该从何学起?等等...

我们知道 Android 应用程序是由 Activity、Service、Broadcast Receiver 和 Content Provide 四大组件中的一个或者多个组成的。有时这些组件运行在同一进程,有时运行在不同的进程。这些进程间的通信就依赖于 Binder IPC 机制。不仅如此,Android 系统对应用层提供的各种服务如:ActivityManagerService、PackageManagerService 等都是基于 Binder IPC 机制来实现的。

Android 系统是基于 Linux 内核的,Linux 已经提供了管道、消息队列、共享内存和 Socket 等 IPC 机制。那为什么 Android 还要提供 Binder 来实现 IPC 呢?主要是基于性能、稳定性和安全性几方面的原因。

性能

首先说说性能上的优势。Socket 作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。共享内存虽然无需拷贝,但控制复杂,难以使用。Binder 只需要一次数据拷贝,性能上仅次于共享内存。

IPC方式

数据拷贝次数

共享内存

0

Binder

1

Socket/管道/消息队列

2

稳定性

再说说稳定性,Binder 基于 C/S 架构,客户端(Client)有什么需求就丢给服务端(Server)去完成,架构清晰、职责明确又相互独立,自然稳定性更好。共享内存虽然无需拷贝,但是控制负责,难以使用。从稳定性的角度讲,Binder 机制是优于内存共享的。

安全性

另一方面就是安全性。Android 作为一个开放性的平台,市场上有各类海量的应用供用户选择安装,因此安全性对于 Android 平台而言极其重要。作为用户当然不希望我们下载的 APP 偷偷读取我的通信录,上传我的隐私数据,后台偷跑流量、消耗手机电量。传统的 IPC 没有任何安全措施,完全依赖上层协议来确保。首先传统的 IPC 接收方无法获得对方可靠的进程用户ID/进程ID(UID/PID),从而无法鉴别对方身份。Android 为每个安装好的 APP 分配了自己的 UID,故而进程的 UID 是鉴别进程身份的重要标志。传统的 IPC 只能由用户在数据包中填入 UID/PID,但这样不可靠,容易被恶意程序利用。可靠的身份标识只有由 IPC 机制在内核中添加。其次传统的 IPC 访问接入点是开放的,只要知道这些接入点的程序都可以和对端建立连接,不管怎样都无法阻止恶意程序通过猜测接收方地址获得连接。同时 Binder 既支持实名 Binder,又支持匿名 Binder,安全性高。

基于上述原因,Android 需要建立一套新的 IPC 机制来满足系统对稳定性、传输性能和安全性方面的要求,这就是 Binder。

最后用一张表格来总结下 Binder 的优势:

优势

描述

性能

只需要一次拷贝数据,性能上仅次于共享内存

稳定性

基于C/S架构,职责明确,架构清晰,稳定性好

安全性

为每个进程分配UID,进程的UID是区分进程身份的重要标志

基本概念介绍

这里我们先从 Linux 中进程间通信涉及的一些基本概念开始介绍,然后逐步展开,向大家说明传统的进程间通信的原理。

Linux基本概念介绍.png

上图展示了 Liunx 中跨进程通信涉及到的一些基本概念:

进程隔离

进程空间划分:用户空间(User Space)/内核空间(Kernel Space)

系统调用:用户态/内核态

Linux 下的传统 IPC 通信原理

传统的IPC通信原理

这种传统的 IPC 通信方式有两个问题:

1.性能低下,一次数据传递需要经历:内存缓存区 --> 内核缓存区 --> 内存缓存区,需要 2 次数据拷贝;

2.接收数据的缓存区由数据接收进程提供,但是接收进程并不知道需要多大的空间来存放将要传递过来的数据,因此只能开辟尽可能大的内存空间或者先调用 API 接收消息头来获取消息体的大小,这两种做法不是浪费空间就是浪费时间。

android 开发艾特功能,Android Binder相关推荐

  1. android 开发艾特功能,Android 仿微博@ # 艾特 话题功能

    public class HtmlText extends TextView { private Context context; private String mData; //接口回调 priva ...

  2. android开发微信分享功能,Android编程实现微信分享信息的方法

    本文实例讲述了Android编程实现微信分享信息的方法.分享给大家供大家参考,具体如下: 随着微信越来越火,越来越多的应用要求有分享到微信的功能.虽然有很多平台都帮集成有分享功能,比如友盟.但是个人觉 ...

  3. Android添加拍照功能,Android开发实现拍照功能的方法实例解析

    本文实例讲述了Android开发实现拍照功能的方法.分享给大家供大家参考,具体如下: 解析: 1)判断是否有摄像头checkCameraHardware(this) 2)获得相机camera = Ca ...

  4. android实现相机功能,Android开发实现拍照功能的方法实例解析

    本文实例讲述了Android开发实现拍照功能的方法.分享给大家供大家参考,具体如下: 解析: 1)判断是否有摄像头checkCameraHardware(this) 2)获得相机camera = Ca ...

  5. Android开发介绍(基于Android Studio软件)

    Android开发介绍(基于Android Studio软件) 关于Android开发,笔者走过一些弯路,因此今天总计了有关Android开发的一些内容和心得,希望对大家有所帮助.首先来一张安卓开发者 ...

  6. android studio开发工具介绍,Android应用开发之Android开发工具介绍、Android Studio配置...

    本文将带你了解Android应用开发之Android开发工具介绍.Android Studio配置,希望本文对大家学Android有所帮助. 2.1   Android Studio配置 2.1.1 ...

  7. Android开发之发送邮件功能的实现(源代码分享)

    Android开发中可能会碰到如何发送邮件的困扰,之前我也查了相关的文档,博友们也分享了不少的发送邮件的办法,总共有3种把,我仔细阅读了下,发现有的讲的太过复杂跟麻烦,不够清晰,我今天就来分享下我认为 ...

  8. android 评论的展开功能,Android开发实现ListView点击展开收起效果示例

    本文实例讲述了Android开发实现ListView点击展开收起效果.分享给大家供大家参考,具体如下: 废话不说先上效果: 实际上这是采用一个ExpandableListView实现的 布局文件很简单 ...

  9. android开发 转跳功能,如何在Android中利用Intent实现一个页面跳转功能

    如何在Android中利用Intent实现一个页面跳转功能 发布时间:2021-02-20 17:06:31 来源:亿速云 阅读:113 作者:Leah 本篇文章为大家展示了如何在Android中利用 ...

最新文章

  1. 新上市Lighthouse专用芯片TS3633规格介绍
  2. 判别学习与生成学习的区别
  3. 鸿蒙系统多会发布,华为官宣鸿蒙系统将发布,还将发布多款新品
  4. 交叉编译ncurses5.6
  5. 牛客网 [编程题]数字和为sum的方法数
  6. 微商团队长的五条管理心法
  7. Markdown转html在网页上显示
  8. nginx request_uri接收到的参数只有一个
  9. 分页组件extremeComponents的使用
  10. AlphaGo算法框架解读
  11. java 盲水印_3步搞定图像盲水印?试试云开发扩展能力
  12. devexpress控件使用笔记
  13. 计算矩阵行列式时奇排列与偶排列的判定
  14. html实现凹陷效果,css3怎么实现字体凹陷凸出效果?(附代码)
  15. 如何给word文档方格打勾
  16. 自整理Java面试题集锦(Java基础 1)
  17. Jmeter录制脚本fiddler fiddler录制jmeter脚本
  18. 概率图模型(D分离)
  19. Quartus Prime 与 Modelsim 调试 及do文件使用
  20. SESAM | GeniE 实用教程

热门文章

  1. [wikioi]奇怪的梦境
  2. Silverlight 5 Features
  3. [导入]画带阴影效果的文字
  4. windows10 C盘清理
  5. 小程序 获取 用户 unionid
  6. data:image data url 文件上传
  7. (二)Cypher语言常用方法举例
  8. 2019贵州大学计算机研究生,贵州大学2019年硕士研究生招生拟录取名单公示(一)...
  9. WPF 蒙罩层 LoadingPage
  10. line-height:1.5和line-height:150%的区别