前言
如何快速高效的掌握一门学问,建议先阅读下这篇文章关于学习的一些看法。
码字不易,记得关注+点赞+收藏
Android Framework系列文章:
Binder面试相关问题
- 为什么Android需要采用Binder?
- Binder一次拷贝原理是什么?
- Binder驱动作用机制?
- Intent传递参数为何有限制? 限制是多少? Binder驱动在哪儿限制?
- Binder是如何做到一次拷贝的?
- 简单说说mmap的机制?
- Binder的如何跨进程的?
- 什么是物理内存, 什么是虚拟内存;
- 四大组件底层的通信机制?
- bindService启动Service的流程;
- Java层Binder实体与BinderProxy
- Android App有多少Binder线程? -> 15个
为什么Android需要采用Binder?
- Android系统是基于Linux内核开发的;
- Linux已经提供了管道,消息队列,共享内存,Socket等IPC机制;
对比:
- 管道: 2次数据拷贝, 1对1关系;
- 共享内存:0次拷贝, n对n关系, 不安全(难以控制);
- Socket: 性能低(一次通信需要几百毫秒);
采用Binder主要基于如下三个方面原因:
- 性能:只需一次数据拷贝;
- 安全:为每个App分配UID,进程的UID是鉴别进程身份的重要标识.
- 设计模式: 基于C/S架构,职责明确,架构清晰, 稳定性强;
Binder传输数据图解:
通信模型(原理与机制):
- Binder 是基于 C/S 架构的。
- 用户空间: 包括 Client、Server、ServiceManager。
- 内核空间:Binder 驱动。
- 其中 Service Manager 和 Binder 驱动由系统提供,而 Client、Server 由应用程序来实现。
- Client、Server 和 ServiceManager 均是通过系统调用 open、mmap 和 ioctl 来访问设备文件 /dev/binder, 从而实现与 Binder 驱动的交互来间接的实现跨进程通信。
-
对于Client,Binder是Server本地对象的一个引用,这个引用实际上是一个代理对象,Client通过这个代理对象来间接访问到Server中的本地对象;
-
对于Server,Binder是提供具体实现的本地对象,需要向ServiceManager注册;
-
对于ServiceManager,它保存了Server,Binder的字符名称和Binder的引用映射,Client通过它来找到Server的Binder引用;
-
对于Binder驱动,它是连接Client和Server的桥梁,负责将代理对象转换为本地对象,将Server中的执行结果返回给Client。