Android面经(13/30)Binder全解析
牛客高级系列专栏:
安卓(安卓系统开发也要掌握)
- 想通关安卓面试,请看(承诺免费售后答疑):《150道安卓高频面试题目录及答案链接》
- 想通关安卓系统面试,请看:《140道安卓系统Framework面试题目录及答案链接》
- 想进阶安卓开发,请看(承诺免费售后答疑):《Android进阶知识体系解析_15大安卓进阶必备知识点》
- 想了解安卓APP完整开发流程,请看(承诺免费售后答疑):《安卓APP完整开发流程》
- 想掌握安卓App性能优化,请看(承诺免费售后答疑):《安卓性能优化讲解和实战专栏》
- 想掌握Gradle语法和配置,制作Gradle插件,请看(承诺免费售后答疑):《安卓Gradle语法解析和实践大全》
嵌入式
- 想通关嵌入式面试,请看: 《111道嵌入式面试题目录及答案链接》
- 想多掌握几个嵌入式项目,请看:《6个嵌入式项目交流分享(附源码)》
本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人对常见安卓高频开发面试题的理解;
网上安卓资料千千万,笔者将继续维护专栏,一杯奶茶价格不止提供答案解析,承诺提供专栏内容免费技术答疑,直接咨询即可。助您提高安卓面试准备效率,为您面试保驾护航!
正文开始⬇
Binder在日常开发经常会用到,毕竟是Android跨进程方法的不二之选。Binder的源码实现逻辑很复杂,本文主要是介绍Binder在面试时可能被Q到的问题,挖Bidner源码的大神可绕道,面试官可能会问:
- 请介绍什么是Binder机制⭐⭐⭐⭐⭐
- 请介绍Binder机制流程 ⭐⭐⭐⭐
- Binder机制需要多少次内存拷贝 ⭐⭐⭐
- Android有很多跨进程通信方法,为何选择Binder?⭐⭐⭐
看完以下的解析,一定可以让面试官眼前一亮。
目录
- 1、Android中的跨进程方法(IPC)
- 1.1 Android中的跨进程方法
- 1.2 为何要使用Binder
- 2、传统的Linux跨进程通讯
- 3、Binder的通讯原理
- 4、Binder通信模型
- 4.1 服务端、客户端、ServiceManager、Binder驱动
- 4.1.1 Binder驱动
- 4.1.2 ServiceManager
- 4.1.3 服务端向ServiceManager注册
- 4.1.4 客户端获取服务端Binder引用
- 4.2 Binder通讯中的代理模式
- 4.3 好多Binder分不清?
- 4.4 Binder通讯流程
- 5、Binder源码分析(外部链接)
- 4.1 服务端、客户端、ServiceManager、Binder驱动
1、Android中的跨进程方法(IPC)
Binder是Android中的一种跨进程通信机制,采用服务端/客户端结构,主要包含服务端、客户端、ServiceManager、Binder驱动4大部分。我们先看看Android中都有哪些跨进程的方法。
1.1 Android中的跨进程方法
- 共享内存:通过共享缓冲区直接映射到各个进程的虚拟地址空间,速度快。但实现比较复杂,进程间的同步问题操作系统无法实现,必须各进程利用同步工具解决;
- 消息队列:提供了一种从一个进程向另一个进程发送一个数据块的方法,但需要进行2次数据拷贝,不适合频繁或者数据量大的情况;
- 管道:分为有名/无名管道,在创建时分配一个page大小的内存,缓存区大小比较有限;
- 信号量:一般作为一种锁机制,用于进程/线程同步;
- 信号:更适合作为进程中断控制,而非数据交换;
- Socket/LocalSocket:允许位于同一主机(计算机)或使用网络连接起来的不同主机上的应用程序之间交换数据;
Binder
:Binder是Android中的一种跨进程通信机制;- 匿名共享内存:在Android系统中,提供了独特的匿名共享内存子系统Ashmem(Anonymous Shared Memory),它利用了Linux的 tmpfs文件系统(一种可以基于RAM或是SWAP的高速文件系统)来实现不同进程间的内存共享。有两个特点:
- 能够辅助内存管理系统来有效地管理不再使用的内存块;
- 通过Binder进程间通信机制来实现进程间的内存共享;
- File:通过文件进行多进程通信用法简单,但不适合高并发情况;
- ContentProvider:Android四大组件之一,常用于进程间数据共享,特别是一对多的情况,不过受限于AIDL;
- Bundle:很常见也很常用,但只能传输Bundle支持的数据类型,同样不适合大量数据的传输;
面试官很喜欢问Android中有哪些跨进程方法,如果你可以答出这么多,一定可以加分
1.2 为何要使用Binder
众所周知,Android系统基于Linux系统,因此Linux系统的IPC方法:共享内存、消息队列、管道、信号量,在Android系统都可以使用。1.1小节就列出了10+种方法,那么为何还需要Binder?
使用Binder的理由可以总结为性能、安全、稳定几个方面:
- 性能:管道、消息队列、Socket都需要2次数据拷贝(即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区),而Binder只要1次(可见第3节分析),且Binder相对Socket方法也更加高效,Socket主要用于跨网络的进程间通讯,传输的效率比较低。当然共享内存1次数据拷贝都不需要,因此就性能而言,共享内存高于Binder;
- 安全:Android系统为每个应用都分配各自的UID以鉴别不同进程。Binder会验证权限,鉴定UID/PID来验证身份,保证了进程通信的安全性;
- 稳定:共享内存1次数据拷贝都不需要,但实现的方法比较复杂,并且需要做好进程同步,容易出现死锁或者资源竞争,稳定性差。而Binder基于C/S架构,客户端和服务端彼此独立,稳定性强。
因此,在Android系统的IPC方式,一般情况下都推荐使用Binder。当然,在Android源码里,上述其他IPC方法也会使用到。接下来让我们先看看传统的Linux跨进程通讯原理。
2、传统的Linux跨进程通讯
Android是基于Linux的,以32位系统来说,在每一个Linux进程都有3G虚拟内存空间,称之为用户空间,以及1G的内核空间。其中,不同进程的用户空间是相互隔离不可直接通讯的,但是内核空间却是共享的。以进程A发送数据到进程B为例,需要经历如下步骤:
- 进程A的内核空间开辟一块内核缓存区,通过copy_from_user()系统调用,将在用户空间的数据拷贝到内核缓存区;
- 进程B的内核空间也开辟了一块内核缓存区,因为不同进程的内核空间共享的,此时进程B就可以通过copy_
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
#提供免费售后答疑!!花一杯奶茶的钱获得安卓面试答疑服务,稳赚不赔# Android发展已经很多年,安卓资料网上千千万,本专栏免费提供专栏内容技术答疑!!私聊当天必回。在阅读过程或者其他安卓学习过程有疑问,都非常欢迎私聊交流。