牛客高级系列专栏:      安卓(安卓系统开发也要掌握)       想通关安卓面试,请看:《150道安卓高频面试题目录及答案链接》    想通关安卓系统面试,请看:《140道安卓系统Framework面试题目录及答案链接》    想进阶安卓开发,请看:《Android进阶知识体系解析_15大安卓进阶必备知识点》    想了解安卓APP完整开发流程,请看:《安卓APP完整开发流程》    想掌握安卓App性能优化,请看:《安卓性能优化讲解和实战专栏》    想掌握Gradle语法,制作Gradle插件,请看:《安卓Gradle语法解析和实践大全》         嵌入式       想通关嵌入式面试,请看: 《111道嵌入式面试题目录及答案链接》    想多掌握几个嵌入式项目,请看:《6个嵌入式项目交流分享(附源码)》             本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人从嵌入式Linux转Android系统开发过程中对常见安卓系统开发面试题的理解;    1份外卖价格助您提高安卓面试准备效率,为您面试保驾护航!!      正文开始⬇   Binder在日常开发经常会用到,毕竟是Android跨进程方法的不二之选。Binder的源码实现逻辑很复杂,本文主要是介绍Binder在面试时可能被Q到的问题,挖Bidner源码的大神可绕道,面试官可能会问:       请介绍什么是Binder机制 ⭐⭐⭐⭐    请介绍Binder机制流程 ⭐⭐⭐⭐    Binder有什么优势?(字节跳动)⭐⭐⭐⭐⭐    Binder机制需要多少次内存拷贝 ⭐⭐⭐    Binder是如何做到一次拷贝?(腾讯) ⭐⭐⭐    Android有很多跨进程通信方法,为何选择Binder?⭐⭐⭐    MMAP的原理讲解(腾讯)⭐⭐    Binder机制是如何跨进程的(阿里)⭐⭐⭐    描述AIDL生成的java类细节(字节跳动)⭐⭐⭐    为什么Intent不能传递大数据(阿里)⭐⭐⭐      看完以下的解析,一定可以让面试官眼前一亮。   目录                  Binder是什么                1.1 Android中的跨进程通讯方法                    为何要使用Binder                2.1 传统的Linux跨进程通讯 2.1.1 背景知识                    Bind的通讯原理                3.1 了解Binder通讯原理需要知道两个概念      3.2 Binder的通讯原理      3.3 Binder有什么优势      3.4 Binder机制是如何跨进程通讯的?      3.5 Binder传输数据的大小限制                    Binder通讯模型                4.1服务端、客户端、ServiceManager、Binder驱动               4.1.1 Binder驱动        4.1.2 ServiceManager             4.2 使用Binder进行数据传输的具体过程               4.2.1 服务端向ServiceManager注册        4.2.2 客户端获取服务端Binder引用        4.2.3 使用服务             4.3 Binder通讯中的代理模式      4.4 好多Binder分不清?      4.5 Binder源码分析         参考文档          1份外卖价格助您提高安卓面试准备效率,为您面试保驾护航!!      1.Binder是什么   Binder是Android系统提供的一种IPC(进程间通信)机制,采用C/S(客户端与服务端结构)架构。Binder原理是掌握Android系统的基石,Binder就像Android中的血管,基本上贯穿了andorid框架层的全部。在Android中我们所使用的Activity,Service等组件都需要和AMS(system_server)通信,这种跨进程的通信都是通过Binder完成。 在基于Binder通信的C/S架构体系中,除了C/S架构所包括的Client端和Server端外,Android还有一个全局的ServiceManager端,它的作用是管理系统中的各种服务(Service)。Client、Server和ServiceManager这三者之间的交互关系如下图所示:      关键点:       从进程间通信的角度看,Binder 是一种进程间通信的机制。    从 Server 进程的角度看,Binder 指的是 Server 中的 Binder 实体对象(Binder类 IBinder)。    从 Client 进程的角度看,Binder 指的是对 Binder 代理对象,是 Binder 实体对象的一个远程代理。    从传输过程的角度看,Binder 是一个可以跨进程传输的对象;Binder 驱动会自动完成代理对象和本地对象之间的转换。    从Android Framework角度看,Binder是ServiceManager连接各种Manager和相应ManagerService的桥梁 Binder跨进程通信机制:基于C/S架构,由Client、Server、ServerManager和Binder驱动组成。      进程空间分为用户空间和内核空间。用户空间不可以进行数据交互;内核空间可以进行数据交互,所有进程共用一个内核空间。Client、Server、ServiceManager均在用户空间中实现,而Binder驱动程序则是在内核空间中实现的。   1.1 Android中的跨进程通讯方法       共享内存:通过共享缓冲区直接映射到各个进程的虚拟地址空间,速度快。但实现比较复杂,进程间的同步问题操作系统无法实现,必须各进程利用同步工具解决。    消息队列:提供了一种从一个进程向另一个进程发送一个数据块的方法,但需要进行2次数据拷贝,不适合频繁或者数据量大的情况。    管道:分为有名/无名管道,在创建时分配一个page大小的内存,缓存区大小比较有限。    信号量:一般作为一种锁机制,用于进程/线程同步。    信号:更适合作为进程中断控制,而非数据交换。    Socket/LocalSocket:允许位于同一主机(计算机)或使用网络连接起来的不同主机上的应用程序之间交换数据;    Binder: Binder是Android中的一种跨进程通信机制;    匿名共享内存:在Android系统中,提供了独特的匿名共享内存子系统Ashmem(Anonymous Shared Memory),它利用了Linux的 tmpfs文件系统(一种可以基于RAM或是SWAP的高速文件系统)来实现不同进程间的内存共享。有两个特点:能够辅助内存管理系统来有效地管理不再使用的内存块; ○通过Binder进程间通信机制来实现进程间的内存共享;    File:两个进程通过读写同一个文件来进行数据共享,共享的文件可以是文本、XML、JOSN。文件共享适用于对数据同步要求不高的进程间通信。通过文件进行多进程通信用法简单,但不适合高并发情况    ContentProvider: Android四大组件之一,常用于进程间数据共享,特别是一对多的情况,不过受限于AIDL;    Bundle:Bundle实现了Parcelable接口,所以它可以方便的在不同的进程间传输。Acitivity、Service、Receiver都是在Intent中通过Bundle来进行数据传递。Bundle很常见也很常用,但只能传输Bundle支持的数据类型,同样不适合大量数据的传输; 面试官很喜欢问Android中有哪些跨进程方法,如果你可以答出这么多,一定可以加分      2.为何要使用Binder   众所周知,Android系统基于Linux系统,因此Linux系统使用的IPC方法:共享内存、消息队列、管道、信号量等,在Android系统上也都能使用。1.1小节就列出了10+种方法,那么为何还需要Binder? 使用Binder的理由可以归纳为:性能、安全、稳定、语言四个方面:       性能:管道、消息队列、Socket都需要2次数据拷贝(即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区),而Binder只要1次(可见第3节分析),且Binder相对Socket方法也更加高效, Socket主要用于跨网络的进程间通讯,传输的效率比较低。当然共享内存1次数据拷都不需要,因此就性能而言,共享内存高于Binder;    安全:Android系统为每个应用都分配各自的UID/PID来验证身份,保证了进程通信的安全性;    稳定:共享内存1次数据拷贝都不需要,但实现的方法比较复杂,并且需要做好进务端同步,容易出现死锁或者资源竞争,稳定性差。而Binder基于C/S架构,客户端和服务端彼此独立,稳定性强。    语言:Linux是基于C语言,C语言是面向过程的,Android应用层和Java Framework是基于Java语言,Java语言是面向对象的。Binder本身符合面向对象的思想,因此作为Androißd的通信机制更合适不过。 因此,在Android系统的IPC方式,一般情况下都推荐使用Binder。当然,在Android源码里,上述其他IPC方法也会使用到。接下来让我们先看看传统的Linux跨进程通讯原理。      2.1 传统的Linux跨进程通讯   2.1.1 背景知识   进程空间分为用户空间和内核空间。用户空间是用户程序代码运行的地方,内核空间是内核代码运行的地方。为了安全,它们是隔离的,这样即使用户程序奔溃了,内核也不受影响。      Android是基于Linux的,以32位系统来说,每个Linux进程都有3G虚拟内存空间,称之为用户空间,以及1G的内核空间。其中,不同进程的用户空间是相互隔离的,不可直接通讯;但是内核空间却是共享的。以讲程A发送数据到进程B为例,需要经历如下步骤:       A进程的内核空间开辟一块内核缓存区,通过copy_                                                        
点赞 1
评论 3
全部评论

相关推荐

06-18 08:36
湖南大学 Java
运营你豪哥:没啥拷打的 1.增加量化结果,现在有点缺效果数据 2.突出复杂性,现在的项目描述有点像功能清单,强调一下技术难点和解决方案。
不给转正的实习,你还去吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务