Android Binder机制之一(简介)

news2025/1/16 20:06:52

目录

前言

一、Android 进程间通信方式

二、Binder架构图

三、Binder涉及角色

3.1 Binder驱动

3.2 Binder实体

3.3 Binder引用

3.4 远程服务

3.5 ServiceManager守护进程

四、涉及源码

前言

        这是本人第N次看Binder 相关知识了,其实每次看都有新的收获,终于下决心做个专题整理,由于个人系统知识面欠缺,加上Binder本身就错综复杂,如有什么不对或者纰漏,欢迎一起讨论指出。

一、Android 进程间通信方式

1. 使用Bundle,实现序列化Parcel接口,底层基于Binder机制;
2. 使用文件共享, 前提是多个进程都具备操作文件的读写权限;
3. 使用Messenger, 底层基于Binder机制
4. 使用AIDL,底层基于Binder机制,不同于Messenger,除了数据传输, 还有RPC 能力;
5. 使用ContentProvider,可以通过标准接口来操作跨进程数据,包括增、删、改、查等
6. 使用Socket,Linux中也常用的;

对于大部分开发者来说一个矛盾体,尤其是对于想在Android中想更上一层楼的小伙们来说这个IPC是既爱又恨,爱的是它极大方便了我们的开发,恨的是它为啥那么复杂而又繁琐呢!但是又不得不学好Binder因为它是迈向Android高阶开发的必经之路。

当然AOSP 一直在迭代, 从Android 8.0 开始,Binder机制,被拆分成了Binder(System分区 进程间通信)、HwBinder(支持System/Vendor分区进程间通信)、VndBinder(Vendor分区进程间通信)。目前我们还是重点关注Binder部分,其他的后续再补充。
 

借用gityuan之前总结一句话: "无Binder不Android"。

二、Binder架构图

Binder通信采用传统的C/S架构,清晰明朗,Server端与Client端相对独立,稳定性较好。
Binder架构中设计4类角色:Binder驱动ServiceManager(后续简称SMgr)ServerClient。其中Server,Client,SMgr运行于用户空间,驱动运行于内核空间

--架构图引用gityuan 

Binder机制的实现具有两层含义:
(1)IPC(Inter-Process Communication),即实现进程间通信。
(2)RPC(Remote Procedure Call),是一种远程过程调用手段

在上图中Binder框架中也实现了如上两层调用:

1) Client先和Server先建立进程间IPC通信
2) Client在和Server建立IPC通信之后,就能如果实现本地服务一样通过RPC调用使用远端Server

这四个角色的关系和互联网非常类似:Server是服务器,Client是客户终端,SMgr是域名服务器(DNS),驱动是路由器。其中四者之间关系有点类似下面的网络关系图:

在这里插入图片描述 参考:一次HTTPS请求的过程

三、Binder涉及角色

3.1 Binder驱动

        Binder 驱动就如同路由器(DNS)一样,是整个通信的核心,Binder驱动是Android专用的,但底层的驱动架构与Linux驱动一样。binder 驱动在以misc设备进行注册,作为虚拟字符设备,没有直接操作硬件,只是对设备内存的处理。该驱动负责进程之间 Binder 通信的建立,数据在各进程之间的传递,Binder 引用计数管理,数据包在进程之间的传递和交互等一系列底层支持。

3.2 Binder实体

   Binder实体,是各个Server以及ServiceManager在内核中的存在形式。Binder实体实际上是内核中binder_node结构体的对象,它的作用是在内核中保存Server和ServiceManager的信息(例如,Binder实体中保存了Server对象在用户空间的地址)。简言之,Binder实体是Server在Binder驱动中的存在形式,内核通过Binder实体可以找到用户空间的Server对象。
如上图中,Server和ServiceManager在Binder驱动中都对应的存在一个Binder实体。

3.3 Binder引用

   说到Binder实体,就不得不说"Binder引用"。所谓Binder引用,实际上是内核中binder_ref结构体的对象,它的作用是在表示"Binder实体"的引用。换句话说,每一个Binder引用都是某一个Binder实体的引用,通过Binder引用可以在内核中找到它对应的Binder实体。
如果将Server看作是Binder实体的话,那么Client就好比Binder引用。Client要和Server通信,它就是通过保存一个Server对象的Binder引用,再通过该Binder引用在内核中找到对应的Binder实体,进而找到Server对象,然后将通信内容发送给Server对象。

Binder实体和Binder引用都是内核(即,Binder驱动)中的数据结构。每一个Server在内核中就表现为一个Binder实体,而每一个Client则表现为一个Binder引用。这样,每个Binder引用都对应一个Binder实体,而每个Binder实体则可以多个Binder引用(多个进程持有)。

3.4 远程服务

   Server都是以服务的形式注册到ServiceManager中进行管理的。如果将Server本身看作是"本地服务"的话,那么Client中的"远程服务"就是本地服务的代理。如果你对代理模式比较熟悉的话,就很容易理解了,远程服务就是本地服务的一个代理,通过该远程服务Client就能和Server进行通信。

3.5 ServiceManager守护进程

ServiceManager是用户空间的一个守护进程。当该应用程序启动时,它会和Binder驱动进行通信,告诉Binder驱动它是服务管理者;对Binder驱动而言,它则会新建ServiceManager对应的Binder实体,并将该Binder实体设为全局变量。

四、涉及源码

1)binder驱动                        /kernel/drivers/android/*

2)servicemanager              /frameworks/native/cmds/servicemanager/*

3)libbinder                           /frameworks/native/libs/binder/*

4)JAVA层                             /frameworks/base/core/java/android/os/*

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker搭建本地私有仓库

目录 一、本地私有仓库的优点 二、Docker搭建本地私有仓库 2.1、首先下载 registry 镜像 2.2、在 daemon.json 文件中添加私有镜像仓库地址 2.3、运行 registry 容器 2.4、Docker容器的重启策略 2.5、为镜像打标签 2.6、上传到私有仓库 2.7、私有仓库的 centos 镜像有…

Cubox是什么应用?如何将Cubox同步至Notion、语雀、在线文档中

Cubox是什么应用? Cubox 是一款跨平台的网络收藏工具,通过浏览器扩展、客户端、手机应用、微信转发等方式,将网页、文字、图片、语音、视频、文件等内容保存起来,再经过自动整理、标签、分类之后,就可以随时阅读、搜索…

02- pandas 数据库 (数据库)

pandas 数据库重点: pandas 的主要数据结构: Series (一维数据)与 DataFrame (二维数据)。 pd.DataFrame(data np.random.randint(0,151,size (5,3)), # 生成pandas数据 index [Danial,Brandon,softpo,Ella,Cindy], # 行索引 …

windeployqt实现一键打包

每次发布QT程序前,都必须要在命令行环境下运行windeployqt 工具进行打包,加载相关的lib文件,才能正常运行。但是在命令行模式下,每次都要手动输入windeployqt的目录,和应用程序的位置目录,效率非常低,见下图: 那QT有没有什么好用的工具可以避免这个问题呢,认真找了一下…

前端如何实现将多页数据合并导出到Excel单Sheet页解决方案|内附代码

前端与数据展示 前后端分离是当前比较盛行的开发模式,它使项目的分工更加明确,后端负责处理、存储数据;前端负责显示数据.前端和后端开发人员通过接口进行数据的交换。因此前端最重要的能力是需要将数据呈现给用户后,与终端用户进行交互。 在前端拿到数…

【Linux】宝塔面板 SSL 证书安装部署

宝塔面板 SSL 证书安装部署前言证书下载宝塔配置SSL注意事项前言 前期有讲过Tomcat和Nginx分别部署SSL证书,但也有好多小伙伴们私信我说,帮忙出一期宝塔面板部署SSL证书的教程,毕竟宝塔的用户体量也是蛮大的,于是宠粉的博主&…

基于地基激光雷达数据和深度学习的Faster R-CNN的橡胶树个体分割

Paper题目:Individual Rubber T ree Segmentation Based on Ground-Based LiDAR Data and Faster R-CNN of Deep Learning Abstract 中国南方的橡胶树经常受到可能导致树体倾斜的自然干扰的影响。从扫描点云中对单个橡胶树进行准确的树冠分割是准确检索树参数的必…

前端 ES6 之 Promise 实践应用与控制反转

Promise 主要是为解决程序异步处理而生的,在现在的前端应用中无处不在,已然成为前端开发中最重要的技能点之一。它不仅解决了以前回调函数地狱嵌套的痛点,更重要的是它提供了更完整、更强大的异步解决方案。 同时 Promise 也是前端面试中必不…

玩转系统|初遇ChatGPT,我和TA的第一次约会

最近互联网圈子有一个非常火爆的话题ChatGPT,短短一周的时间就有上百万的用户,如果你不是程序员,也许会问这到底是个什么玩意?ChatGPT是什么?ChatGPT,美国“开放人工智能研究中心”研发的聊天机器人程序 [1…

CAPL(vTESTStudio) - DoIP - TCP接收_04

TCP接收 函数介绍 TcpOpen函数

LeetCode刷题系列 -- 59. 螺旋矩阵 II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。示例 1:输入:n 3输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2:输入:n 1输出&#xff1…

以后更新功能,再也不用App发版了!智能小程序将为开发者最大化减负

在 IoT 时代,越来越多的企业意识到打造自有 App 对于品牌的重要性。作为智能设备不可或缺的控制终端,App 具备连接用户、完善服务、精细化运营用户的独特优势,可帮助企业大大提升品牌竞争力。 为了帮助品牌企业打造更具个性化、差异化的智能…

MoveIT Rviz和Gazebo联合仿真

文章目录环境安装概述ros_control框架ros_control数据流文件配置附加工具故障问题解决参考接前两篇:ROS MoveIT1(Noetic)安装总结 Solidworks导出为URDF用于MoveIT总结(带prismatic) MoveIT1 Assistant 总结 环境 Ubu…

网络安全协议(3)

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.当前流行操作系统的安全等级 1.Windows的安全等级 什么是EAL…

不花钱体验最近火出圈的 ChatGPT 是真的

OpenAI 发布的 ChatGPT,一经发布在科技圈就火得不行了! ChatGPT 是什么呢? 它是一款由 OpenAl 开发的语言模型产品,它能够模拟人类的语言行为,与用户进行自然的交互。ChatGPT 基于GPT-3.5(Generative Pre…

linux基本功系列之lsof命令实战

文章目录前言一. lsof命令介绍二. 语法格式及常用选项三. 参考案例3.1 显示系统打开的文件3.2 查找某个文件相关的进程3.3 列出某个用户打开的文件信息3.4 列出某个程序进程所打开的文件信息3.5 查看某个进程号打开的文件3.6 列出所有的网络连接3.7 列出谁在使用某个端口3.8 恢…

OSS(Object Storage Service)进行上传图片,下载图片(详细看文档可以完成操作)

文章目录1.单体前后端项目上传1.上传流程2. BuckName 和EndPoint3. AccessKey 和Access Secret(创建RAM(Resource Access Manage)的子账号,然后可以获得Accesskey和Acess Secret)3.根据创建的子账号分配OSS的所有权限(可以对文件进行上传&…

【年度总结】回望大学四年坎坷的2022

【年度总结】回望大学四年&坎坷的2022 2022年,我毕业了! 满心欢喜的离开,到现在看来,却甚是想念大学的时光。 这一年,绝对是我此生过的最难的一年。考研失利、工作不顺、投资失败、“财政”赤字...... 现在的我…

浅析依赖注入框架的生命周期(以 InversifyJS 为例)

在上一篇介绍了 VSCode 的依赖注入设计,并且实现了一个简单的 IOC 框架。但是距离成为一个生产环境可用的框架还差的很远。 行业内已经有许多非常优秀的开源 IOC 框架,它们划分了更为清晰地模块来应对复杂情况下依赖注入运行的正确性。 这里我将以 Inv…

RiproV2主题首页中间网站动态栏美化教程

优化描述 Riprov2官网首页如下: 中间部分网站动态条过于简单,想优化成本文后续的样子,本教程解决这个问题。 优化后可设置滚动,可显示会员总数,今日发布,本周发布,资源总数等项。 优化后的具体网站: