Android Binder进程间通信机制


前言

IPC(Inter-Process Communication)为进程间通信或跨进程通信,是指两个进程进行进程间通信的过程。

在Android中,为每一个应用程序都分配了一个独立的虚拟机,不同虚拟机在内存分配上都有不同的地址空间,互相访问数据需要借助其他手段。下面介绍在Android中实现IPC的方式。


一、Binder机制简介

为了系统的安全与稳定,Linux系统是存在进程隔离的:两个不同的进程,如应用App进程和ActivityManagerService服务所在的system_server系统进程,是无法直接通过内存地址访问到对方内部的函数或者变量的。所以两个进程如果需要相互访问就涉及到一个跨进程通信的概念即IPC(Inter-process communication,进程间通讯)。本质上是借助于不同进程的内核空间都是共享的原理,两个不同的进程都去访问内核空间,从而达到“间接”访问对方的目的。Binder就是Android系统中大量使用的IPC机制,无论是应用程序对系统服务的请求(例如应用调用系统核心服务AMS的startActivity接口去实现应用启动),还是应用程序自身提供对外服务,都需要使用到Binder。因此,Binder机制在Android系统中的地位非常重要,可以说,理解Binder是理解Android系统的前提。本文将基于最新的Android 11代码,全面分析Binder机制的全貌。

其实在Unix/Linux系统中,存在很多传统的IPC机制。如管道、消息队列、共享内存、Socket、信号量等。但是Android系统虽然是基于Linux系统但是却很少会使用这些这些传统的IPC机制,而是大部分场景下都是使用Binder。主要原因是,相对于传统的IPC机制,Binder有如下三点优势:

  1. 性能上的优势:管道,消息队列,Socket的通讯都需要两次数据拷贝,而Binder由于使用了内存映射所以只需要一次拷贝。要知道,对于系统底层的IPC形式,少一次数据拷贝,对整体性能的影响是非常之大的。
  2. 稳定性上的优势:Binder本身是C/S架构的,客户端(Client)有什么需求就丢给服务端(Server)去完成,架构清晰、职责明确又相互独立,自然稳定性更好。共享内存虽然无需拷贝,但是控制负责,难以使用。从稳定性的角度讲,Binder机制是优于内存共享的。
  3. 安全性上的优势:传统IPC形式,无法得到对方的身份标识(UID/PID),而在使用Binder IPC时,这些身份标示是跟随调用过程而自动传递的。Server端很容易就可以知道Client端的身份,非常便于做安全检查,这一点对移动操作系统非常重要。

二、Binder整体架构

借用一张经典的架构图来描述binder的整体架构全貌,如下所示:

在这里插入图片描述

从图中可以看出。这个Binder机制从架构上大致可以分为三层:

  1. 驱动层,我们知道Android系统是基于Linux内核的,Binder驱动层则位于Linux内核中。Binder 驱动会将自己注册为一个misc device,并向上层提供一个dev/binder节点(此Binder节点并不会对应真实的硬件设备)。Binder驱动运行在内核态,提供了最底层的数据传递,对象标识,线程管理,调用过程控制等功能,是Binder实现跨进程通信的核心。
  2. Framework C++层,以驱动层为基础,Binder机制C++的封装实现。
  3. Framework Java层,Binder机制的Java层的封装实现,采用JNI调用复用C++层的实现。

Binder通信架构是典型的C/S架构,由Client、Server、ServiceManager、Binder Driver四大组件组成。Client、Server、ServiceManager、Binder Driver这几个组件在通信过程中扮演的角色就如同互联网中服务器(Server)、客户端(Client)、DNS域名服务器(ServiceManager)以及路由器(Binder Driver)之间的关系。其相互配合完成一次Binder通信的大概过程如下:

  1. 首先在系统开机启动时,一个进程通过Binder驱动将自己注册成ServiceManager,其地址固定为0;
  2. Server通过驱动向ServiceManager中注册Binder(Server中的Binder实体),表明可以对外提供服务。驱动为这个Binder创建位于内核中的实体节点以及ServiceManager对实体的引用,将名字以及新建的引用打包传给ServiceManager,ServiceManger将其填入查找表;
  3. Client通过名字,在Binder驱动的帮助下从ServiceManager中获取到对Binder实体的引用,通过这个引用就能实现和Server进程的通信。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值