Android系统面经(1/20)深入解析Binder

牛客高级系列专栏:

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


嵌入式


  • 本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人从嵌入式Linux转Android系统开发过程中对常见安卓系统开发面试题的理解;
  • 1份外卖价格助您提高安卓面试准备效率,为您面试保驾护航!!

正文开始⬇

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

  • 请介绍什么是Binder机制 ⭐⭐⭐⭐
  • 请介绍Binder机制流程 ⭐⭐⭐⭐
  • Binder有什么优势?(字节跳动)⭐⭐⭐⭐⭐
  • Binder机制需要多少次内存拷贝 ⭐⭐⭐
  • Binder是如何做到一次拷贝?(腾讯) ⭐⭐⭐
  • Android有很多跨进程通信方法,为何选择Binder?⭐⭐⭐
  • MMAP的原理讲解(腾讯)⭐⭐
  • Binder机制是如何跨进程的(阿里)⭐⭐⭐
  • 描述AIDL生成的java类细节(字节跳动)⭐⭐⭐
  • 为什么Intent不能传递大数据(阿里)⭐⭐⭐

看完以下的解析,一定可以让面试官眼前一亮。

目录

    1. Binder是什么
    • 1.1 Android中的跨进程通讯方法
    1. 为何要使用Binder
    • 2.1 传统的Linux跨进程通讯 2.1.1 背景知识
    1. Bind的通讯原理
    • 3.1 了解Binder通讯原理需要知道两个概念
    • 3.2 Binder的通讯原理
    • 3.3 Binder有什么优势
    • 3.4 Binder机制是如何跨进程通讯的?
    • 3.5 Binder传输数据的大小限制
    1. 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_

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Android系统面试题全解析 文章被收录于专栏

2020年研究生毕业后,工作重心由嵌入式Linux转为安卓系统,Android发展已经很多年,网上面向中初级Android系统开发的面经还比较少,也不够集中,因此梳理出本专栏,本专栏收集了本人工作中持续积累的众多安卓系统知识,持续更新中。

全部评论
有个疑问,发送进程通过 copy_to_user()将数据拷贝到 内核缓存区,为啥binder创建的接受缓存区跟接收进程的客户空间直接是映射?从上图看前后都是 客户空间跟内核空间的交互,发送进程的用户空间跟 内核空间为啥不存在映射?
点赞 回复 分享
发布于 2023-08-19 22:11 湖北
安卓面试技巧
点赞 回复 分享
发布于 2023-02-21 09:24 天津
案例分析更好理解了
点赞 回复 分享
发布于 2023-02-21 09:03 江苏

相关推荐

04-23 20:36
门头沟学院 Java
1. 自我介绍。2. 实习的系统大概是一个什么样的系统?3. 实习中主要负责了哪些内容?4. 你觉得这个系统的技术难点在哪里?5. 这个系统里需求开发和迭代的整体流程是怎样的?6. 拿到需求之后,你们是怎么做技术方案评估和评审的?7. 开发完成之后,code review 是怎么做的?8. 测试是怎么配合的?你自己会不会写单测?一般测到什么程度?9. 你参与的这套系统整体架构是怎样的?10. 从入口层、业务层到存储层分别是什么形态?涉及哪些中间件和组件?11. 服务是怎么部署的?是容器化部署还是其他方式?12. 这个 AI agent 项目主要是解决什么问题?为什么要做这样一套东西?13. 这个项目想解决的痛点是什么?为什么普通大模型方案不够?14. 这个项目是真实被使用的系统,还是偏学习性质的项目?15. 系统设计题:如果有一个告警系统,里面有 10 万条告警规则,要定时扫描并判断是否触发告警,这个任务怎么设计?16. 规则很多、扫描频率固定时,怎么优化读取和扫描性能?17. 多实例下怎么协同完成规则扫描任务?18. 怎么决定某一条规则该由哪个实例来扫描,且保证不重复、不遗漏?19. 如果实例数会扩缩容,这种规则分配方案要怎么设计?20. 一致性哈希在这种分布式任务分配场景里怎么落地?21. 这个规则扫描任务能不能借助 MQ 来做?如果可以,整体方案怎么设计?22. 如果用 MQ,谁来生产待扫描任务?定时任务、数据库、MQ 三者怎么配合?23. HashMap 底层是怎么实现的?24. JDK 1.7 和 1.8 的 HashMap 有什么区别?25. 数组、链表、红黑树在 HashMap 里是怎么配合工作的?26. HashMap 为什么读写平均复杂度能比较低?27. Hash 冲突是怎么解决的?HashMap 主要采用了什么方式?28. 概率题:有一枚正反面概率不均匀的硬币,怎么公平地决定两个人谁去做一件事?29. 如果只能抛两次硬币,能不能设计一个公平方案?30. 从浏览器输入一个 URL 到页面最终展示,中间经历了哪些过程?31. Redis 为什么快?32. 如果 Redis 内存满了会怎么办?33. 算法题:无重复字符的最长子串。34. 你之前项目里提到过 MCP,你怎么理解 MCP?35. MCP 和 skill 这类能力分别解决什么问题?36. MCP 这种协议的优点和缺点分别是什么?37. MCP 在工具很多的时候,会不会也带来上下文膨胀或者性能问题?38. skill 是什么?为什么会有 skill 这种设计?39. skill 越来越多时,会遇到什么问题?怎么理解上下文过长、成本升高这些问题?40. 你平时是怎么学习 AI 相关内容的?41. 反问
我的求职进度条
点赞 评论 收藏
分享
04-23 20:38
门头沟学院 Java
1. 英文自我介绍。2. 简历里的项目和实习是什么关系?是自己做的还是公司里的?3. 这些项目主要是做什么的?4. HTTPS 建立安全通信连接的大致过程是什么?5. HTTPS 的安全性主要是怎么保证的?6. 如果要应对秒杀这类瞬间高流量场景,系统需要做哪些设计?7. Redis 在秒杀场景里如何保证库存扣减的原子性?8. MySQL 层还需要做哪些兜底,来防止超卖、重复请求或者重复消费?9. 版本号在这里主要解决什么问题?10. 你怎么验证自己设计的这些限流、削峰、异步化方案真的生效了?11. 如果一个用户对同一条内容只能点赞一次,这个功能怎么设计?12. 为什么用 Redis 的 set 能保证一个用户只能点赞一次?13. 在分布式场景下,怎么生成全局唯一 ID?14. 如果拿 ID 做分库分表路由,怎样避免数据分布不均、某些分片特别热?15. 外部知识库主要是用来解决什么问题?16. 引入外部知识库以后,主要想改善大模型的哪些能力问题?17. 大模型产生幻觉的原因是什么?18. 向量化存储主要是为了解决什么问题?19. 为什么传统关系型数据库不太适合直接处理这类知识检索场景?20. Redis 在这个进度同步方案里承担了什么角色?21. 这个方案最后能把误差控制到什么程度?为什么?22. 这个方案最终带来了什么效果?23. 在点赞模块里,为什么同时用了乐观锁和分布式锁?24. 你怎么理解悲观锁和乐观锁?25. 悲观锁会给整个系统带来哪些问题?26. 悲观锁除了性能下降之外,还可能带来什么风险?27. 死锁产生的条件有哪些?28. 如果要从应用层面上避免死锁,可以怎么做?29. 乐观锁会带来哪些问题?30. 除了直接比较旧值和新值,还能通过什么方式实现乐观锁?31. 乐观锁和悲观锁分别更适合什么业务场景?32. 你怎么规划自己毕业后的职业发展?33. 你怎么理解管理这件事?34. 做团队统筹规划的主要难点是什么?35. 算法题:爬楼梯。36. 反问
我的求职进度条
点赞 评论 收藏
分享
评论
2
17
分享

创作者周榜

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