Binder机制最简单易懂的讲解

一、引言

Android系统已经有其他的IPC方式,管道,Socket等,为什么还要使用Binder呢?

1.1 性能方面

Binder数据拷贝只需要一次,管道,消息队列,Socket都需要两次

共享内存实现方式较复杂

1.2 安全方面

传统通信方面对身份并没有做出严格的验证,比如Socket通过IP通信很容易伪造

Binder支持双方身份的验证,安全性高

二、Binder概述

2.1 IPC机制

客户端有Client进程空间和一个共享的内核空间,Server进程也有自己的用户空间和共享内核空间,每个进程独享自己的数据和空间,这是进程隔离,如图

2.2 Binder通信中的四个角色

2.2.1 用户空间实现(3个)

Client进程:使用服务,开发者自定义实现

Server进程:注册服务,开发者自定义实现

ServerManager进程:将字符形式Binder转化为Client中Binder的引用,是一个守护进程,用来管理Server,并向Client提供查询Server接口的能力

2.2.2 内核空间实现(1个)

Binder驱动:底层进程通信建立,Binder进程间传递,已在Android平台实现,开发者只需要调用即可

2.3 Binder运行机制

如图

 

调用Server进程向ServerManager注册服务,Client进程向ServerManager获取服务,获取服务之后Client进程与Server进程建立通信通路,开始交互。

2.4 一个例子

跨进程调用系统服务例子:

浮动窗口添加

//获取WindowManager服务引用
WindowManager wm = (WindowManager)getSystemService(getApplication().WINDOW_SERVICE);  
//布局参数layoutParams相关设置略...
View view=LayoutInflater.from(getApplication()).inflate(R.layout.float_layout, null);  
//添加view
wm.addView(view, layoutParams);

在Android开机过程中Android初始化会各种服务,客户端想要服务直接通过ServiceManager获取即可

代码第二行即获取一个WindowManager的引用

代码最后一行远程调用addView,调用的是运行在systemServer进程中的WindowManager的addView函数

 

2.5 一个完整的服务调用过程

client调用server接口方法,server将client传递的参数打包成一个Parcel对象然后发送给内核中的binder driver —— 一个请求完成

server读取binder driver的请求数据,确认是发给自己的处理解析Parcel对象并将结果返回 —— 一个请求处理完成

整个调用过程是同步的,server在处理的时候client会被阻塞,所以client的调用不应该在主线程 —— 总结

三、一些问题

3.1 为什么Binder只进行了一次数据拷贝

Linux内核并没有从一个用户空间到另一个用户空间直接拷贝的函数,拷贝需要先将数据拷到内核空间,然后再从内核空间拷贝到其他进程空间

假设有两个进程A,B

为了实现用户到用户的空间的直接拷贝,在分配内存的时候,内存地址不仅仅被映射到A用户空间,还被映射到了内核空间,所以在A进程进行拷贝时相当于直接把数据拷贝到了B进程的用户空间,所以B进程只需要进行一次拷贝即可获取A进程用户空间。

参考文章:

https://www.jianshu.com/p/4920c7781afe?from=jiantop.com

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安卓系统中,进程间通信 (IPC)是通过 Binder 机制来实现的,它是一种基于内核的进程间通信机制,用于在不同的进程之间传递数据。下面是一个详细讲解: 1. 什么是 Binder 机制Binder 机制是安卓系统中的一种 IPC 机制,它支持进程间通信和远程过程调用。Binder 机制的核心是 Binder 驱动程序,它提供了一种特殊的通信通道,允许进程之间进行通信和数据传输。 2. Binder 机制的工作原理 Binder 机制的工作原理可以分为以下几个步骤: (1)客户端进程调用服务端进程 客户端进程通过 Binder 驱动程序向服务端进程发送请求,请求会被打包成一个 Binder 事务并发送到服务端进程。 (2)服务端进程处理请求 服务端进程接收到 Binder 事务后,会根据事务中的指令进行相应的处理,并将处理结果返回给客户端进程。 (3)客户端进程接收响应 客户端进程接收到服务端进程返回的响应后,会进行相应的处理。 3. Binder 机制的组成部分 Binder 机制由以下几个组成部分: (1)Binder 驱动程序 Binder 驱动程序是 Binder 机制的核心组件,它提供了一个驱动程序和一组底层函数,用于管理 Binder 对象和 Binder 通信。 (2)Binder 服务 Binder 服务是指运行在服务端进程中的代码,用于处理客户端进程发送的请求。 (3)Binder 代理 Binder 代理是指运行在客户端进程中的代码,用于向 Binder 服务发送请求并接收响应。 (4)Binder 对象 Binder 对象是指在进程间传输的数据对象,它们包含了一些元数据和实际的数据。每个 Binder 对象都有一个唯一的标识符,称为 Binder 标识符。 4. Binder 机制的优点 (1)高效性 Binder 机制使用了共享内存和缓存技术,能够实现高效的数据传输。 (2)安全性 Binder 机制使用了权限控制机制,只有具有相应权限的进程才能访问 Binder 对象。 (3)可扩展性 Binder 机制支持多线程和多进程,可以实现高并发和高负载的应用程序。 5. 总结 Binder 机制是安卓系统中的一种 IPC 机制,它通过 Binder 驱动程序来实现进程间的通信和数据传输。Binder 机制具有高效性、安全性和可扩展性等优点,是安卓系统的核心组件之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值