Android Binder通信原理(一):简介

这篇具有很好参考价值的文章主要介绍了Android Binder通信原理(一):简介。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

源码基于:Android R

0. 前言

在Linux 系统中现有的进程间通信(IPC)方式:

  • 管道(PIPE):在创建时分配一个page大小的内存,缓存区大小比较有限;
  • 命名管道(FIFO):考虑 PIPE_BUF 和原子操作;
  • 消息队列:信息复制两次,额外的CPU消耗;不合适频繁或信息量大的通信;
  • 共享内存: 无须复制,共享缓冲区直接付附加到进程虚拟地址空间,速度快;但进程间的同步问题操作系统无法实现,必须各进程利用同步工具解决;
  • 套接字: 作为更通用的接口,传输效率低,主要用于不通机器或跨网络的通信;
  • 信号量: 常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段; 
  • 信号: 不适用于信息交换,更适用于进程中断控制,比如非法内存访问,杀死某个进程等;

0.1 使用Binder 原因

0.1.1 性能

Socket 作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。

消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。

共享内存虽然无需拷贝,但控制复杂,难以使用。

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

0.1.2 稳定性

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

从稳定性的角度讲,Binder 机制是优于内存共享的。

0.1.3 安全性

Android 为每个安装好的 APP 分配了自己的 UID,故而进程的 UID 是鉴别进程身份的重要标志。传统的 IPC 只能由用户在数据包中填入 UID/PID,但这样不可靠,容易被恶意程序利用。可靠的身份标识只有由 IPC 机制在内核中添加。其次传统的 IPC 访问接入点是开放的,只要知道这些接入点的程序都可以和对端建立连接,不管怎样都无法阻止恶意程序通过猜测接收方地址获得连接。同时 Binder 既支持实名 Binder,又支持匿名 Binder,安全性高。

2. Binder 划分

在Android 8.0 之前,Binder机制比较简单,只有一个驱动设备"/dev/binder",一个守护进行"/system/bin/servicemanager",一个binder库"/system/lib64/libbinder.so".

在Android 8.0开始,Android引入了Treble的机制,为了方便Android系统的快速移植、升级,提升系统稳定性,Binder机制被拓展成了"/dev/binder", "/dev/hwbinder""/dev/vndbinder"

我们原先使用的"/dev/binder",成为框架进程的专有节点,这意味着供应商进程无法再访问此节点。供应商进程可以访问 /dev/hwbinder,但必须将其 AIDL 接口转为使用 HIDL。

对于想要继续在供应商进程之间使用 AIDL 接口的供应商,需要使用 /dev/vndbinder(而非 /dev/binder)。

Android8.0 及之后的Binder域如下图所示:

Android Binder通信原理(一):简介

3. 三种 binder 介绍

 Android Binder通信原理(一):简介 

 Android Binder通信原理(一):简介 

 Android Binder通信原理(一):简介 

3.1 vndbinder 和 binder

vnbinder 和binder 使用的是一个ServiceManager 和libbinder,只不过在选择的时候会区分open /dev/binder 还是/dev/vnbinder:

 Android Binder通信原理(一):简介 

 Android Binder通信原理(一):简介 

frameworks/native/cmds/servicemanager/main.cpp

int main(int argc, char** argv) {
    if (argc > 2) {
        LOG(FATAL) << "usage: " << argv[0] << " [binder driver]";
    }

    const char* driver = argc == 2 ? argv[1] : "/dev/binder";

    sp<ProcessState> ps = ProcessState::initWithDriver(driver);
    ps->setThreadPoolMaxThreadCount(0);
    ps->setCallRestriction(ProcessState::CallRestriction::FATAL_IF_NOT_ONEWAY);

    sp<ServiceManager> manager = new ServiceManager(std::make_unique<Access>());
    if (!manager->addService("manager", manager, false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk()) {
        LOG(ERROR) << "Could not self register servicemanager";
    }

    ..
}

代码中根据参数选择性的将driver 传入进行open,详细看ProcessState::initWithDriver() 函数。

通常,供应商进程不直接打开 Binder 驱动程序,而是链接到打开 Binder 驱动程序的 libbinder 用户空间库。为 ::android::ProcessState() 添加方法可为 libbinder 选择 Binder 驱动程序。供应商进程应该在调用 ProcessState、IPCThreadState 或发出任何普通 Binder 调用之前调用此方法。要使用该方法,请在供应商进程(客户端和服务器)的 main() 后放置以下调用:

ProcessState::initWithDriver("/dev/vndbinder");

dev/binder和dev/vndbinder无法在一个进程中同时使用

binder和vndbiner 的机制共用一套libbinder,因此两者使用时,每次只能指定一个设备节点,不能同时使用。

3.2 hwbinder

hwbinder 独立于binder和vndbinder,拥有独立的驱动设备 /dev/hwbinder,独立的hwservicemanager (system/hwservicemanager/ 目录) 和独立的binder 库libhwbinder (system/libhwbinder/ 目录)。

android 8.0 以后采用了treble 的架构,framework 和HAL 是独立的,在不同的 fw 和 HAL 进程中,进程间通信使用的是 HIDL 语言,而不在使用 AIDL 语言,因此使用了不同的 binder 驱动设备

3.3 binder 库的变化

binder

vndbinder

hwbinder

lib binder 位置

frameworks/native/libs/binder

frameworks/native/libs/binder

system/libhwbinder

service manager 位置

frameworks/native/cmds/servicemanager

frameworks/native/cmds/servicemanager

system/hwservicemanager文章来源地址https://www.toymoban.com/news/detail-494967.html

到了这里,关于Android Binder通信原理(一):简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Binder通信原理

    注:本文大部分代码来自安卓11 ● 从IPC角度来说,Binder是Android中的一种跨进程通信方式,Binder还可以理解为一种虚拟的物理设备驱动,它的设备驱动是/dev/binder,该通信方式以前在linux中没有 ● 从Android Framework角度来说,Binder是ServiceManager连接各种Manager(ActivityManager、Windo

    2024年02月03日
    浏览(27)
  • Android Binder——Java层通信实例(十六)

            前面的文章中我们介绍了 Java 层服务的注册流程,以及代理文件的查找。这里我们看一个 Binder 通信的实例,为了方便我们就以 Android 源码中现有的功能 PMS 的 install 为例,PMS 在进行 APK 安装时,会进行 dex 的翻译,依赖守护进程 installd 完成。         在 Binder

    2024年04月23日
    浏览(37)
  • Android Binder常用案例使用分析,跨进程通信aidl

    service组件的binderService获取binder通信。 servicemanager.getService方法获取相关服务。 本质上都是IBinder通信。 客户端:使用intent,启动服务端的service,使用binderservice,在onServiceConnected回调方法中获取服务端的实际binder对象。使用aidl中的接口调用服务端的方法即可。 服务端:定义

    2024年02月07日
    浏览(30)
  • Android 进阶——Binder IPC之Binder IPC架构及原理概述(九)

    前面几篇文章,为我们学习Binder IPC通信机制提供了扎实的理论基础,接下来将正式进入Binder IPC通信架构及原理的解读。 Binder 是基于 C/S 架构的,由一系列的组件组成,包括 Client进程、Server进程、Service Manager进程、Binder 驱动。其中 Client进程、Server进程、Service Manager进程运行

    2023年04月09日
    浏览(31)
  • Android Binder机制浅谈以及使用Binder进行跨进程通信的俩种方式(AIDL以及直接利用Binder的transact方法实现)

    Binder机制学习 ·为何新增Binder来作为主要的IPC方式 Android也是基于Linux内核,Linux现有的进程通信手段有管道/消息队列/共享内存/套接字/信号量。 既然有现有的IPC方式,为什么重新设计一套Binder机制呢? 主要是出于以上三个方面的考量: 2. binder是什么? 从进程间通信的角度

    2024年02月16日
    浏览(23)
  • BpBinder与PPBinder调用过程——Android开发Binder IPC通信技术

    在Android系统中,进程间通信(IPC)是一个非常重要的话题。Android系统通过Binder IPC机制实现进程间通信,而Binder IPC通信技术则是Android系统中最为重要的进程间通信技术之一。本文将介绍Binder IPC通信技术的原理,并详细解析BpBinder与PPBinder调用过程的使用以及注意事项。 Bind

    2024年02月13日
    浏览(25)
  • 写给 Android 应用工程师的 Binder 原理剖析

    这篇文章我酝酿了很久,参考了很多学习文档,读了很多源码,却依旧不敢下笔。生怕自己理解上还有偏差,对大家造成误解,贻笑大方。又怕自己理解不够透彻,无法用清晰直白的文字准确的表达出 Binder 的设计精髓。直到今天提笔写作时还依旧战战兢兢。 Binder 之复杂远远

    2024年02月13日
    浏览(45)
  • AR 体验的“后浪,Android源码的Binder权限是如何控制

    △ 左边没有遮挡功能的“喵星人”在空间里穿越,缺乏真实感,右侧开启遮挡功能的“喵星人”则逼真地藏在了 而有了 Depth API,虚拟物体可以在现实世界找到自己的位置,和环境良好互动,让我们一起看一些优秀的使用案例。 “遮挡”掉不真实 让精彩上线 开发了 Five Nig

    2024年04月17日
    浏览(28)
  • 【Android】Binder(一)Binder的介绍和AIDL使用Binder的实例

    Android 中的 Binder 是一个进程间通信机制,它允许不同进程之间相互调用方法和传递数据。Binder 主要用于实现系统服务和应用程序之间的通信,以及实现 IPC(Inter-Process Communication,进程间通信)。 Binder 的核心是 Binder 驱动程序,它负责管理不同进程之间的通信。每个进程都可

    2024年02月07日
    浏览(27)
  • 【安卓源码】Binder机制3 -- Binder线程池

    Binder本身是C/S架构,就可能存在多个Client会同时访问Server的情况。 在这种情况下,如果Server只有一个线程处理响应,就会导致客户端的请求可能需要排队而导致响应过慢的现象发生。解决这个问题的方法就是引入多线程。【多个客户端不同线程去请求,服务端需要使用多线程

    2023年04月27日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包