| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Android Binder通信机制学习(一) -> 正文阅读 |
|
[移动开发]Android Binder通信机制学习(一) |
新人阿彡的Android多媒体学习之路🚄🚄🚄 第一章 Android Binder通信机制学习之Binder基本原理 本章目录0、前言主要参考:https://zhuanlan.zhihu.com/p/35519585 作为一名新步入Android领域的职场老鸟,奈何最近环境不好,整体越来越卷的大背景下,本老鸟又新进入Android开发这个领域,后续工作基本应该是主攻Android Framework层的开发,辅助Android Applicatios层的开发,在这里记录一下个人的学习之旅,一方面方便自己学习总结,另一方面也方便后续的查漏补缺。整体学习基于Android 12 版本的代码。 1、Android为什么选择Binder通信Android是基于Linux内核的,所以Android要实现进程间的通信,其实大可使用linux原有的一些手段,比如管道,共享内存,socket等方式,但是Android还是采用了Binder作为主要机制,主要是基于性能、稳定性和安全性几方面的原因。
综上所述,Android需要一种高效率,安全性高的进程通信方式,也就是Binder,Binder只需要一次拷贝,性能仅次于共享内存,而且采用的传统的C/S结构,稳定性也是没得说,发送添加UID/PID,安全性高。 2、Linux下进程间通信原理回顾
基本概念:
图片来源:https://zhuanlan.zhihu.com/p/35519585 简单的说就是,内核空间(Kernel)是系统内核运行的空间,用户空间(User Space)是用户程序运行的空间。为了保证安全性,它们之间是隔离的。
传统IPC通信原理 这种传统的 IPC 通信方式有两个问题:
3、Binder跨进程通信原理传统的 IPC 方式如Pipe、Socket 都是内核的一部分,通过内核支持来实现进程间通信,自然没问题。但是 Binder 并不是 Linux 系统内核的一部分,因此,需要借助 Linux 的动态内核可加载模块(Loadable Kernel Module,LKM)的机制,动态添加一个内核模块运行在内核空间中,这个内核模块就是Binder 驱动(Binder Dirver)。 但mmap通常用在有物理介质的文件系统上。因为,进程中的用户空间是不能直接访问物理设备的,所以,通常情况下,我们对磁盘上一个文件进行I/O读写时,系统先把磁盘的数据拷贝到内核空间,再从内核空间把数据拷贝到用户区域。这种情况下,就可以通过mmap来做映射,用内存读写取代I/O读写,省去了数据拷贝,提高效率。
如上代码,我们将一个文件映射到内存中,然后往内存中写入一串数据,数据将会同步写入文件中。
图片来源:https://zhuanlan.zhihu.com/p/35519585 4、Binder通信基本模型介绍完 Binder IPC 的底层通信原理,接下来我们看看实现层面是如何设计的。一次完整的进程间通信必然至少包含两个进程,通常我们称通信的双方分别为客户端进程(Client)和服务端进程(Server),由于进程隔离机制的存在,通信双方必然需要借助 Binder 来实现。 Client、Server、ServiceManager、Binder 驱动这几个组件在通信过程中扮演的角色就如同互联网中服务器(Server)、客户端(Client)、DNS域名服务器(ServiceManager)以及路由器(Binder 驱动)之前的关系。 我们知道ServerManager也是属于用户空间的一个进程,主要作用就是作为Server和Client的桥梁,Client可以从ServerManager拿到Server中Binder实体的引用,这么说可能有点模糊,举个简单的例子,我们访问,www.google.com,谷歌首页页面就显示出来了,首先我们知道,这个页面肯定是发布在谷歌某个服务器上的,DNS通过这个网址,解析出对应的ip地址,再根据ip地址去访问对应的页面,然后再把数据返回给客户端,完成交互。这个和Binder的C/S非常类似,这里的DNS就是对应的ServerManager,首先,Server中的Binder实体对象,将自己的引用(也就是ip地址)注册到ServerManager,Client通过特定的key(也就是谷歌这个网址)和这个引用进行绑定,ServerManager内部自己维护一个类似MAP的表来一一对应,通过这个key就可以向ServerManager拿到Server中Binder的引用,对应到Android开发中,我们知道很多系统服务都是通过Binder去和AMS进行交互的,比如获取音量服务:AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); 但是这里ServerManager和Server也是两个不同的进程,Server要向ServerManager去注册不是也要涉及到进程间的通信吗?当前实现进程间通信又要用到进程间的通信?Binder的巧妙之处在于,当ServerManager作为Serve端的时候,它提供的Binder比较特殊,它没有名字也不需要注册,当一个进程使用BINDER_SET_CONTEXT_MGR命令将自己注册成ServerManager时Binder驱动会自动为它创建Binder实体,这个Binder的引用在所有Client中都固定为0而无须通过其它手段获得。也就是说,一个Server若要向ServerManager注册自己的Binder就必需通过0这个引用号和ServerManager的Binder通信,这里Server和Client属于两个不同的进程,Client怎么能拿到Server中对象,不妨先看看下面的交互图 Binder 通信中的代理模式 至此,我们大致能总结出 Binder 通信过程:
我们看到整个通信过程都需要 Binder 驱动的接入。下图能更加直观的展现整个通信过程(为了进一步抽象通信过程以及呈现上的方便,下图我们忽略了 Binder 实体及其引用的概念): 本章主要对比了下Binder与传统的IPC通信方式的区别和优劣势,并详细介绍了Binder通信的基本原理以及详细模型,以DNS域名服务器这个例子来加深理解。关于Binder基本原理的内容这一章就暂时学习这么多,下一章我们将结合源码学习Binder在架构设计上面的具体实现。 5、参考1、写给 Android 应用工程师的 Binder 原理剖析 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 0:25:54- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |