Android面经(13/30)Binder全解析

牛客高级系列专栏:

安卓(安卓系统开发也要掌握)


嵌入式


本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人对常见安卓高频开发面试题的理解;

网上安卓资料千千万,笔者将继续维护专栏,一杯奶茶价格不止提供答案解析,承诺提供专栏内容免费技术答疑,直接咨询即可。助您提高安卓面试准备效率,为您面试保驾护航!

正文开始⬇

Binder在日常开发经常会用到,毕竟是Android跨进程方法的不二之选。Binder的源码实现逻辑很复杂,本文主要是介绍Binder在面试时可能被Q到的问题,挖Bidner源码的大神可绕道,面试官可能会问:

  1. 请介绍什么是Binder机制⭐⭐⭐⭐⭐
  2. 请介绍Binder机制流程 ⭐⭐⭐⭐
  3. Binder机制需要多少次内存拷贝 ⭐⭐⭐
  4. 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源码分析(外部链接)

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高频面试题全解析 文章被收录于专栏

#提供免费售后答疑!!花一杯奶茶的钱获得安卓面试答疑服务,稳赚不赔# Android发展已经很多年,安卓资料网上千千万,本专栏免费提供专栏内容技术答疑!!私聊当天必回。在阅读过程或者其他安卓学习过程有疑问,都非常欢迎私聊交流。

全部评论
感谢分享
点赞 回复 分享
发布于 2022-12-20 13:30 重庆
大佬好
点赞 回复 分享
发布于 2022-12-20 13:38 浙江

相关推荐

头像
11-21 11:39
四川大学 Java
是红鸢啊:忘了还没结束,还有字节的5k 违约金
点赞 评论 收藏
分享
面试摇了我吧:啊哈哈面试提前五个小时发,点击不能参加就是放弃
点赞 评论 收藏
分享
评论
9
10
分享
牛客网
牛客企业服务