Android Framework系列之Binder

860 阅读2分钟

前言

如何快速高效的掌握一门学问,建议先阅读下这篇文章关于学习的一些看法

码字不易,记得关注+点赞+收藏

Android Framework系列文章:

Android Framework系列之系统架构

Android Framework系列之启动流程

Android Framework系列之Binder机制

Android Framework系列之Handler机制

Binder面试相关问题

  1. 为什么Android需要采用Binder?
  2. Binder一次拷贝原理是什么?
  3. Binder驱动作用机制?
  4. Intent传递参数为何有限制? 限制是多少? Binder驱动在哪儿限制?
  5. Binder是如何做到一次拷贝的?
  6. 简单说说mmap的机制?
  7. Binder的如何跨进程的?
  8. 什么是物理内存, 什么是虚拟内存;
  9. 四大组件底层的通信机制?
  10. bindService启动Service的流程;
  11. Java层Binder实体与BinderProxy
  12. Android App有多少Binder线程? -> 15个

为什么Android需要采用Binder?

  • Android系统是基于Linux内核开发的;
  • Linux已经提供了管道,消息队列,共享内存,Socket等IPC机制;

对比:

  • 管道: 2次数据拷贝, 1对1关系;
  • 共享内存:0次拷贝, n对n关系, 不安全(难以控制);
  • Socket: 性能低(一次通信需要几百毫秒);

采用Binder主要基于如下三个方面原因:

  1. 性能:只需一次数据拷贝;
  2. 安全:为每个App分配UID,进程的UID是鉴别进程身份的重要标识.
  3. 设计模式: 基于C/S架构,职责明确,架构清晰, 稳定性强;

Binder传输数据图解:

image.png

通信模型(原理与机制):

  • Binder 是基于 C/S 架构的。
  • 用户空间: 包括 Client、Server、ServiceManager。
  • 内核空间:Binder 驱动。
  • 其中 Service Manager 和 Binder 驱动由系统提供,而 Client、Server 由应用程序来实现。
  • Client、Server 和 ServiceManager 均是通过系统调用 open、mmap 和 ioctl 来访问设备文件 /dev/binder, 从而实现与 Binder 驱动的交互来间接的实现跨进程通信。
  1. 对于Client,Binder是Server本地对象的一个引用,这个引用实际上是一个代理对象,Client通过这个代理对象来间接访问到Server中的本地对象;

  2. 对于Server,Binder是提供具体实现的本地对象,需要向ServiceManager注册;

  3. 对于ServiceManager,它保存了Server,Binder的字符名称和Binder的引用映射,Client通过它来找到Server的Binder引用;

  4. 对于Binder驱动,它是连接Client和Server的桥梁,负责将代理对象转换为本地对象,将Server中的执行结果返回给Client。