借助 AIDL 理解 Android Binder 机制——Binder 来龙去脉

Android 进程间通信的方式有很多种,比如 Messenger、文件(SharePreference)、AIDL、Socket 和 Content Provider 等,它们当中 Messenge、AIDL 和 Content Provider 的底层都是依赖于 Binder 机制去实现的。除此之外,Android 四大组件的启动和通信的核心过程也是通过 Binder 机制去实现的,这里,我们借助 AIDL 来了解 Binder 的实现机制。

在了解 AIDL 机制和用法之前,首先要了解几个概念,这对后续的深入理解有较大的帮助。

进程隔离

以下内容来自维基百科:

进程隔离是为保护操作系统中进程互不干扰而设计的一组不同硬件和软件的技术。这个技术是为了避免进程  A 写入进程 B 的情况发生。进程的隔离实现,使用了虚拟地址空间。进程 A 的虚拟地址和进程B的虚拟地址不同,这样就防止进程 A 将数据信息写入进程 B。

Linux IPC 原理

由于 Linux 采用了虚拟地址空间技术,操作系统在逻辑上将虚拟内存分为用户空间(User Space)内核空间(Kernel Space),普通应用程序运行在用户空间,系统内核运行在内核空间,为了控制应用程序的访问范围、保证系统安全,用户空间只能通过系统调用的方式去访问内核空间。当进程执行系统调用而陷入内核代码的时候,该进程则进入了内核态,相比之下,进程在用户空间执行自己的代码的时候,则是处于用户态

由于进程 A 和进程 B 的虚拟地址不同,因此它们之间是相互透明的,都以为自己独享了系统的资源,当然也不能直接跟对方交互。但是,有些情况下有些进程难免会需要跟其他进程进行交互,这个交互过程就叫 IPC(Inter-Process Communication,进程间通信)。IPC 的实质就是数据的交互,因此我们这里将进行 IPC 过程中的通信调用方和被调用放分别称为数据发送方和数据接收方,IPC 通信的过程如下:

  1. 数据发送方进程将数据放在内存缓存区,通过系统调用陷入内核态

  2. 内核程序在内核空间开辟一块内核缓存区,通过 copy_from_user 函数将数据从数据发送方用户空间的内存缓存区拷贝到内核空间的内核缓存区中

  3. 数据接收方进程在自己的用户空间开辟一块内存缓存区

  4. 内核程序将内核缓存区中通过 copy_to_user 函数将数据拷贝到数据接收方进程的内存缓存区

通过以上过程,一次 IPC 就完成了,但是这种传统的 IPC 机制有两个问题:

  • 性能比较低:整个过程数据的传递需要经历发送方内存缓存区——内核缓存区——接收方内存缓存区的过程

  • 接收方进程事先不知道需要开辟多大的内存用于存放数据,因此需要开辟尽可能大的空间或者事先调用 API 来解决这个问题,这两种方式不是浪费空间就是浪费时间。

Binder IPC 原理

为了克服 Linux 传统的 IPC 机制中的不足之处,Android 系统引入了 Binder 机制,从字面上看 Binder 是胶水的意思,在这里,Binder 的职责是在不同的进程之间扮演一个桥梁的角色,让它们之间能够相互通信。从上一小节内容可以了解到,进程间的通信少不了 Linux 内核的支持,而 Binder 并不属于内核的一部分,但是,得益于 Linux 的 LKM(Loadable Kernel Module) 机制:

模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行

因此,Binder 作为这种模块存在于内核之中,也称为 Binder 驱动。回顾上一小节的内容,传统 Linux IPC 的过程需要经历两次数据拷贝,Binder 借助 Linux 的另一个特性,只用一次数据拷贝,就能实现 IPC 过程,这就是内存映射

Binder IPC 机制中涉及到的内存映射通过 mmap() 来实现,mmap() 是操作系统中一种内存映射的方法。内存映射简单的讲就是将用户空间的一块内存区域映射到内核空间,映射关系建立后,用户对这块内存区域的修改可以直接反应到内核空间;反之内核空间对这段区域的修改也能直接反应到用户空间。

内存映射能减少数据拷贝次数,实现用户空间和内核空间的高效互动。两个空间各自的修改能直接反映在映射的内存区域,从而被对方空间及时感知。也正因为如此,内存映射能够提供对进程间通信的支持。

Binder IPC 通信过程如下:

  1. Binder 驱动在内核空间创建一个数据接收缓存区

  2. 然后在内核空间开辟一块内存缓存区并与数据接收缓存区建立映射关系,同时,建立数据接收缓存区数据接收方的内存缓存区的映射关系

最后

想要了解更多关于大厂面试的同学可以点赞支持一下,除此之外,我也分享一些优质资源,包括:Android学习PDF+架构视频+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值