上次没砍我的,这次我又来了;看完这篇还不明白 Binder 你砍我

news/2024/4/30 13:53:54/文章来源:https://blog.csdn.net/m0_70748845/article/details/126977580

最近一段时间由于工作,接触到 Framework 部分比较多一点,也难免要和 Binder 打一些交道, 因为在 Android 系统中,每一个应用程序都是由一些 ActivityService 组成的,这些 ActivityService 有可能运行在同一个进程中,也有可能运行在不同的进程中;那么,不在同一个进程的 Activity 或者 Service 是如何通信的呢?这就是本文中要介绍的 IPC 机制中的 Binder 进程间通信机制

首先来了解下什么是 IPC 机制

Linux 中,是以进程单位分配和管理资源的;出于保护机制,一个进程不能直接访问另一个进程的资源,也就是说,进程之间互相封闭;但是,一个复杂的应用系统中,通常会使用多个相关的进程来共同完成一项任务,因此要求进程之间必须能够互相通信,从而共享资源和信息;所以,操作系统内核必须提供进程间的通信机制(IPC)

IPC 机制种类

  • 采用命名管道(name pipe)
  • 消息队列(message queue)
  • 信号(signal)
  • 内存共享(share memory)

但在 Android 终端上的应用软件的通信几乎看不到这些 IPC 通信方式,取而代之的是 Binder 方式

什么是 Binder ?

Binder 是 Android 系统中最重要的特性之一;正如其名**“粘合剂”,它是粘合系统间各个组件的桥梁,Android 系统的开放式设计也很大程度上得益于这种跨进程通信机制**

所以理解 Binder 对于理解整个 Android 系统有着非常重要的作用,Android 系统的四大组件AMS,PMS系统服务无一不与 Binder 挂钩;如果对Binder 不甚了解,那么就很难了解这些系统机制,从而仅仅浮与表面,不懂 Binder 你都不好意思说自己会 Android 开发;想要深入 Android,Binder 必须迈出的一步

Binder 进程通讯

应用程序虽然是以独立的进程来运行的,但相互之间还是需要通信,比如,在多进程的环境下,应用程序后台服务通常会运行在不同的进程中,有着独立的地址空间,但是因为需要相互协作,彼此间又必须进行通信和数据共享,这就需要进程通信来完成

进程间通信的方式

Linux 系统中有:

  • socket
  • named pipe
  • message queue
  • signal
  • share
  • memory

Java 系统中也有:

  • socket
  • namedpipe

所以 Android 可以选择的进程间通信的方式也很多,但是它主要包括以下几种方式:

  • 标准 Linux Kernel IPC 接口
  • 标准 D-BUS 接口
  • Binder 接口

为什么选择 Binder ?

在上面这些可供选择的方式中,Android 使用得最多也最被认可的还是 Binder 机制;为什么会选择Binder来作为进程之间的通信机制呢?

实则是因为 Binder 更加简洁和快速消耗的内存资源更小吗?不错,这些也正是 Binder优点;当然,也还有很多其他原因,比如传统的进程间通信可能会增加进程的开销,而且有进程过载安全漏洞等方面的风险,Binder 正好能解决和避免这些问题;Binder主要能提供以下一些功能:

  • 用驱动程序来推进进程间的通信
  • 通过共享内存来提高性能
  • 为进程请求分配每个进程的线程池
  • 针对系统中的对象引入了引用计数和跨进程的对象引用映射
  • 进程间同步调用

再来看看 Binder 的线程管理

Binder 线程池的概念

  • 每个 Server 进程在启动时会创建一个 binder 线程池,并向其中注册一个 Binder 线程;之后 Server 进程也可以向 binder 线程池注册新的线程,或者 Binder 驱动在探测到没有空闲 binder 线程时会主动向Server进程注册新的的 binder 线程
  • 对于一个Server进程有一个最大Binder线程数限制,默认为16个binder线程,例如Android的system_server进程就存在16个线程。对于所有Client端进程的binder请求都是交由Server端进程的binder线程来处理的

Binder 实际上是位于不同进程中的线程之间的通信

  • 假如进程 S 是 Server 端,提供 Binder 实体,线程 T1 从 Client 进程 C1 中通过 Binder 的引用向进程 S 发送请求
  • S 为了处理这个请求需要启动线程 T2,而此时线程 T1 处于接收返回数据的等待状态。T2 处理完请求就会将处理结果返回给 T1,T1 被唤醒得到处理结果
  • 在这过程中,T2 仿佛 T1 在进程S中的代理,代表T1执行远程任务,而给T1的感觉就是象穿越到S中执行一段代码又回到了 C1
  • 为了使这种穿越更加真实,驱动会将 T1 的一些属性赋给 T2,特别是 T1 的优先级 nice,这样 T2 会使用和 T1 类似的时间完成任务
  • 很多资料会用**‘线程迁移’来形容这种现象,容易让人产生误解一来线程根本不可能在进程之间跳来跳去,二来T2除了和T1优先级一样,其它没有相同之处,包括身份,打开文件,栈大小,信号处理,私有数据**等
Binder 线程与 Binder 主线程的区别
  • 线程是否可以终止 Loop,不过目前启动的 Binder 线程都是无法退出的,其实可以全部看做是 Binder 主线程
  • 其实现原理是,在 SystemServer 主线程执行到最后的时候,Loop 监听 Binder 设备,变身死循环线程

关于工作线程的启动,Binder 驱动还做了一点小小的优化

  • 当进程 P1 的线程 T1 向进程 P2 发送请求时,驱动会先查看一下线程 T1 是否也正在处理来自 P2 某个线程请求但尚未完成(没有发送回复);这种情况通常发生在两个进程都有 Binder 实体并互相对发时请求时

  • 假如驱动在进程 P2中 发现了这样的线程,比如说 T2,就会要求 T2 来处理 T1 的这次请求;因为T2既然向 T1 发送了请求尚未得到返回包,说明 T2 肯定(或将会)阻塞在读取返回包的状态;这时候可以让 T2 顺便做点事情,总比等在那里闲着好;而且如果 T2 不是线程池中的线程还可以为线程池分担部分工作,减少线程池使用率

  • Binder 线程是 执行 Binder 服务的载体,只对于服务端才有意义,对请求端来说,是不需要考虑 Binder 线程的;所以 Binder 线程就是执行 Binder 实体业务的线程

今天有关于 Framework IPC 机制中的 Binder 进程间通信机制的阐述就到这里了;为了帮助大家了解更多 Android Framework 框架层 必备的技术知识,这里特别提供一份由腾讯大佬所整理的一张 Framework 思维导图及其配套的一份学习手册;有需要这份思维导图及学习手册 的朋友: 可以私信发送 “架构图”“进阶” 即可 直达获取;希望大家看完之后能给大家一些帮助

内容展示如下:

Android Framework 思维导图

高清版 Android Framework 思维导图 获取方式:私信发送 “架构图” 即可 直达获取

应用程序与 AMS 的通讯实现

  • 从应用程序进程到管理者进程
  • 应用程序进程向管理者进程发送消息
  • 从管理者进程到应用程序进程
  • 管理者进程向应用程序进程发送消息
  • 用户进程接收消息

完整版 Android Framework 思维导图及学习手册 获取方式: 私信发送 “架构图” 或 “进阶” 即可 直达获取

应用进程与 WMS 的通讯实现

  • WindowManagerImpl & WindowManagerGlobal
  • ViewRootImpl
  • 从应用进程到管理者进程
  • 从管理者进程到应用进程

应用进程之间的通讯实现

  • 服务端编写 AIDL 文件
  • 编写 Service
  • 声明 Service
  • 客户端编写 AIDL 文件
  • 绑定服务,并调用
  • IBinder实现原理

完整版 Android Framework 思维导图及学习手册 获取方式: 私信发送 “架构图” 或 “进阶” 即可 直达获取

既然选择了程序员这个行业,那么你一定要做好充足的准备;要想在人前显贵,背后所付出的辛劳和汗水就是必须的

Android 架构师之路还能漫长,与君共勉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_11675.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java基于springboot+vue的旅游心得分享攻略系统 elementui

SpringBoot是当前最流向的一个框架,它的配置更加的简单,使开发变得更加的简单迅速。 Spring Boot 的基础结构共三个文件,具体如下: src/main/java:程序开发以及主程序入口; src/main/resources:…

vue serve及其与vue-cli-service serve之间的关系

vue serve及其与vue-cli-service serve之间的关系 目录 vue serve及其与vue-cli-service serve之间的关系 一、前言 二、vue命令 三、package.json的preset预置的配置命令参数 3.1、依赖与开发依赖 3.2、vue/cli-service 的内部 3.3、vue -***命令如何跑起来 四、vue …

HTML篇三——(2)

目录一、HTML常用标签1.5 文本格式化标签1.6 <div> 和<span>标签一、HTML常用标签 标题标签、段落标签、换行标签见&#xff1a;https://editor.csdn.net/md/?articleId126970642 1.5 文本格式化标签 文本格式化标签是为文字设置粗体、斜体以及下划线等效果&am…

有了这个 Python 库,以后再也不用写正则表达式了

正则表达式大家应该有了解过吧&#xff1f;它功能很强大&#xff0c;但有一个痛点就是不太容易读写&#xff0c;我们需要了解正则的很多语法规则才能写出一个健壮的正则表达式&#xff0c;很多朋友估计听到正则表达式估计都焦头烂额了。 就没有解决办法吗&#xff1f; 有的&a…

单播以及多播的书写实验

实验目的&#xff1a; 学习对每个分类单播的理解以及书写 学习对每个分类多播的理解以及书写 实验说明&#xff1a; 通过此实验练习&#xff0c;可以更好的掌握IPv6地址书写以及分类 实验环境&#xff1a; 两台支持SPSERVICES的IOS的路由器 直通线以及串口线 实…

树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”

首先我们要知道&#xff0c;驱动的两大利器&#xff1a;电路图&#xff08;通过电路图去寻找寄存器&#xff09;和芯片手册 一、寄存器的介绍 芯片手册第六章的89页&#xff0c;GPIO有41个寄存器&#xff0c;所有访问都是32位的。Description是寄存器的功能描述。GPFSEL0&…

2022年最新《Java八股文面试宝典》全网独一份!(效率最高、知识最新、包含各个技术栈)

今天在脉脉刷到了这么一条消息&#xff0c;现在这个大环境&#xff0c;都后悔学Java了&#xff0c;想转行学前端&#xff0c; 看完很是震惊&#xff0c;据大数据统计&#xff0c;Java的待遇是要好过前端的。小伙伴竟然被卷到想要转行......但是行情这个东西&#xff0c;也不是我…

vue3.x之isRef toRefs isRef readonly 公共数据配置 axios配置 路由配置

isRef toRefs toRef 参数&#xff1a; (源对象 , 源对象属性) 可以用来为源响应式对象上的某个 property 新创建一个 ref。然后&#xff0c;ref 可以被传递&#xff0c;它会保持对其源 property 的响应式连接。 也就是说源响应式对象(toRef的第一个参数) 上的某个 property…

【3D视觉】PointNet解析

您好&#xff0c;各位&#xff01;今天就基于3D点云数据的分类以及分割模型 : PointNet与PointNet做一个简单的解析&#xff0c;解析部分将结合论文与代码&#xff0c;加上一些我个人微不足道&#xff08;也不一定对&#xff09;的见解在里面。 在看PointNet与PointNet之前&am…

第三章实验

实例一print("今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?\n") number = int(input("请输入您认为符合条件的数:")) if number%3 == 2 and number%5 == 3 and number%7 == 2:print(number,"符合条件:三三数之剩二,五五数…

GBase 8s是如何实现库中数据安全保障的

随着计算机网络的广泛应用&#xff0c;网上信息的开放性与共享性日益增强&#xff0c;但随之而来的是信息安全问 题愈发严重。数据库是这些数据信息存储的主要场所&#xff0c;因此确保数据库中存储以及存取信息的安 全是确保网络安全的首要问题。为此&#xff0c;需要在通用的…

Nginx在Linux下的安装

✨ Nginx在Linux下的安装安装pcre安装其他的依赖安装Nginx(把压缩包放到opt目录)&#x1f4c3;个人主页:不断前进的皮卡丘&#x1f31e;博客描述:梦想也许遥不可及&#xff0c;但重要的是追梦的过程&#xff0c;用博客记录自己的成长&#xff0c;记录自己一步一步向上攀登的印记…

软件测试 git和gitee集成Pycharm 基于Flask的Mock Server服务器

文章目录1 Git1.1 作用1.2 工具1.3 名称解释2 安装git和注册Gitee3 使用Git(1)clone克隆命令(2)初始化(3)查看文件状态(4)文件提交暂存区(5)提交到本地版本库(6)修改文件(7)查看日志(8)跳转到提交的时间截点4 git和gitee集成Pycharm4.1 在Pycharm安装git和连接gitee(1)新建项目…

交互与前端3 前端需求简单梳理

说明 技术的终点是前端 我是从模型/算法作为起点的,顺着工作的需要和自己的兴趣&#xff0c;慢慢的逐步走到了前端。我想现在也是时候把前端搞好了&#xff0c;前端有几个作用&#xff1a; 1 对外可以作为广告。技术最终还是要考虑变现的。2 与外部协同。有很多工作是需要外部…

关于穿越机FPV视频果冻效应的讨论

关于穿越机FPV视频果冻效应的讨论1. 名词定义2. 摄像原理2.1 快门分类2.2 卷帘拍摄3. 产生原因4. 解决方法4.1 振动出处4.2 软件方法(辅助作用)4.3 硬件方法(直接办法)5. F450试验机遇到的问题5.1 现象5.2 测试5.3 减震改善5.4 其他改善5.5 初步结论5.6 改进方向6. 总结7. 参考…

基于ssm的远程家庭健康监测管理系统设计与实现-计算机毕业设计源码+LW文档

开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;…

常用的荧光染料示踪剂 Me-tetrazine-ICG,甲基-四嗪-吲哚菁绿 有哪些特点?

甲基-四嗪-吲哚菁绿是一种荧光染料化合物&#xff0c;四嗪可通过TCO点击化学标记到其它大分子上。吲哚菁绿是生物学中常用的荧光染料示踪剂&#xff0c;波长更长。 西安凯新生物科技有限公司常规修饰性聚乙二醇常备现 货&#xff0c;非常规基团修饰性聚乙二醇&#xff08;PEG&a…

h5(1)

H5 一、canvas标签 canvas是绘图标签&#xff0c;可以使用该标签在网页上生成一块画布&#xff0c;然后就可以在这块画布中随意的绘图。 canvas标签基本使用&#xff1a; <canvas width"500" height"500" id"cvs"></canvas> //w…

AWS聚焦数字经济与可持续发展

2022年中国国际服务贸易交易会于9月5日圆满闭幕&#xff0c;AWS在此间展示了多项领先的云计算技术和行业解决方案。围绕着本届服贸会“服务合作促发展绿色创新迎未来”的主题&#xff0c;AWS也在此次论坛中诠释和传递着其在助力数字经济及企业可持续发展的价值愿景。 9月3日与…

springboot 上传文件/图片到本地文件夹,利用nginx可以采用地址打开该文件

springboot 上传文件/图片到本地文件夹&#xff0c;利用nginx可以采用地址打开该文件 步骤&#xff1a; 一、下载nginx 打开nginx.conf 文件&#xff0c;配置nginx 启动nginx在nginx.exe文件所在的文件夹路径上直接cmd&#xff0c;输入nginx.exe即可启动nginx 注意&#xff…