参考学习视频:2021字节跳动、腾讯、阿里巴巴、美团、OPPO、华为、百度等一线

目录

  • 问题一:Binder有什么优势?(字节跳动)
  • 问题二:Binder是如何做到一次拷贝?(腾讯)
  • 问题三:MMAP的原理讲解(腾讯)
  • 问题四:Binder机制是如何跨进程的(阿里)
  • 问题五:描述AIDL生成的java类细节(字节跳动)
  • 问题六:为什么Intent不能传递大数据(阿里)

Binder是什么?(C/S)
Binder就是Android中的血管。在Android中我们所使用的Activity,Service等组件都需要和AMS(system_server)通信,这种跨进程的通信都是通过Binder完成。

  • 机制:Binder是一种进程间通信机制;
  • 驱动:Binder是一个虚拟物理设备驱动;
  • 应用层:Binder是一个能发起通信的Java类;

多进程的使用及优势:

虚拟机分配给各个进程的运行内存是有限制的,LMK(Low Memory Killer,进程回收机制)也会优先回收对系统资源的占用多的进程。

  • 突破进程内存限制:如图库占用内存过多;
  • 功能稳定:独立的通信进程保存长连接的稳定性;
  • 规避系统内存泄露:独立的WebView进程阻隔内存泄露导致的问题;
  • 隔离风险:对于不稳定的功能放入独立进程,避免导致主进程崩溃;

查看每个虚拟机分配的内存大小命令:

adb shell
getprop dalvik.vm.heapsize

常用设置多进程的方式:

在AndoridManifest.xml文件的配置中添加
android:process

问题一:Binder有什么优势?(字节跳动)

Linux进程间通信机制有:管道、socket、信号、消息队列、共享内存等等。

内存划分:
内存被操作系统划分成两块:用户空间和内核空间,用户空间是用户程序代码运行的地方,内核空间是内核代码运行的地方。为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不受影响。

  用户空间和内核空间其实所指的都是虚拟内存,它们只是一个地址,用户操作的时候,只能操作这个虚拟地址,但是这个虚拟地址会映射到一个物理内存,也就是说,用户操作虚拟地址,其实就是操作物理地址中的数据。

虚拟地址是操作系统进行管理的,虚拟地址映射到物理地址真正最终处理是由硬件管理的。

所有应用的内核内存空间是共享的。
物理内存其实就是:内存条、磁盘、硬盘等


从进程1向进程2发送消息是通过上图中的绿色箭头进行传输。

以前传统通信方式:

binder通信方式:

Binder与传统IPC对比

Binder 共享内存 Socket
性能 需要拷贝一次 无需拷贝 需要拷贝两次
特点 基于C/S架构,易用性高 控制复杂,易用性差 基于C/S架构,作为一款通用接口,其传输效率低,开销大
安全性 为每个APP分配UID,同时支持实名和匿名 依赖上层协议,访问接入点是开放的,不安全 依赖上层协议,访问接入点是开放的,不安全

如何区分实名服务还是匿名服务:看它有没有注册到SM(ServerManager,相当于一个服务大管家)中。

AMS是实名服务
自己创建的服务是匿名服务

问题二:Binder是如何做到一次拷贝?(腾讯)

接收方和内核有一块共享区域。

binder传输数据

  发送方将数据拷贝到内核地址空间后,内核地址空间是一个虚拟内存,它是没有放数据,最终是将数据放到物理内存中,而接收方和内核空间有一块共享的物理内存。binder其实就是相对于将接收方用户空间与发送方的内核空间其中的有块物理内存进行了共享。发送方发送数据,就是把数据放到了共享区域中,这样就等同于放到了接收方的用户空间中。

问题三:MMAP的原理讲解(腾讯)

  Linux通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射(memory mapping, mmap)。

  对文件进行mmap,会在进程的虚拟内存分配地址空间,创建映射关系。
  实现这样的映射关系后,就可以采用指针的方式读写操作这一段内存,而系统会自动回写到对应的文件磁盘上。

  所有的系统资源管理都是在内核空间中完成的。比如读写磁盘文件,分配回收内存,从网络接口读写数据等等。用户空间通过系统调用让内核空间完成这些功能。

写文件流程:

  1. 调用write,告诉内核需要写入数据的开始地址与长度;
  2. 内核将数据拷贝到内核缓存
  3. 由操作系统调用,将数据拷贝到磁盘,完成写入

问题四:Binder机制是如何跨进程的(阿里)

  由于发送方进程1和接收方进程2不能直接进行通信,由于内核空间是共享的,发送方通过copy_from_user()把数据直接拷贝到内核空间,因为内核空间与接收方的用户空间同时映射到一块物理内存中,所以说数据通过copy_from_user()拷贝到内核地址空间指定的虚拟内存后,相对于直接进入了接收方的用户空间,所以整个通信过程只进行了一次内存拷贝,这个映射就是通过mmap实现的。

问题五:描述AIDL生成的java类细节(字节跳动)

Proxy类是提供给客户端使用,Stub类是提供给服务端使用
Stub中的asInterface方法就是区分是跨进程还是非跨进程,如果是跨进程就方法代理对象,如果不是跨进程就直接返回服务端

private ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {iPersonManage = Stub.asInterface(service);  //如果是跨进程,iPersonManage就是代理对象}@Overridepublic void onServiceDisconnected(ComponentName name) {iPersonManager = null;}
}

stub.java

public static IPersonManager asInterface(IBinder binder) {if (bind == null) {return null;}IInterface iin = binder.queryLocalInterface(DESCRIPTOR);if ((iin != null && (iin instanceof IPersonManager)) {return (IPersonManager) iin;  //非跨进程} return new Proxy(binder);  // 跨进程
}

客户端:
mRemote.transact—>mRemote指的就是IBinder,执行这条语句之后,客户端就会挂起,等待服务器去完成它的处理。
客户端是否会挂起,这个需要分两种情况进行处理(一般去通信的话都是同步情况):

  1. 同步情况,客户端会挂起,如果在主线程执行,可能会出现ANR
  2. 异步情况,客户端不会挂起
    Proxy.java
    下面的接口主要是进入binder
@Override
public void addPerson(Person person) throws RemoteException {parcel data = Parcel.obtain();  //data包:指客户端准备发给服务端的数据Parcel reply = Parcel.obtain(); //reply包:指服务端准备返回什么数据try {data.writeInterfaceToken(DESCRIPTOR);if (person != null) {data.writeInt(1);person.writeToParcel(data, 0);} else {data.writeInt(0);}mRemote.transact(Stub.TRANSACTION_addPerson, data, reply,0); //mRemote.transact()流程其实就是客户端-->binder-->服务端,最后一个参数flags = 0:表示同步逻辑操作,如果改成oneway表示异步操作reply.readException();} finally {reply.recycle();data.recycle();}
}

服务端(stub):
服务端会实现onTransact()方法,通过IBinder的方法id来判断客户端调用服务端的哪个方法。

Stub.java

@Override
protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {switch (code) {case INTERFACE_TRANSACTION:reply.writeString(DESCRIPTOR);return true;case TRANSACTION_addPerson:data.enforceInterface(DESCRIPTOR); //解包Person arg0 = null;if ((0 != data.readInt())) {arg0 = Person.CREATOR.createFromParcel(data);}this.addPerson(arg0); //调用到服务端中对应的接口方法reply.writeNoException();return true;case TRANSACTION_getPersonList:data.enforceInterface(DESCRIPTOR);List<Person> result = this.getPersonList();reply.writeNoException();reply.writeTypedList(result);  //如果有返回结果,会将返回结果写到reply中return true;case TRANSACTION_setData:data.enforceInterface(DESCRIPTOR);byte[] _arg0;_arg0 = data.createByteArray();this.setData(_arg0);reply.writeNoException();return true;}return super.onTransact(code, data, reply, flags);
}static final int TRANSACTION_addPerson = IBinder.FIRST_CALL_TRANSACTION;
static final int TRANSACTION_getPersonList = IBinder.FIRST_CALL_TRANSACTION + 1;
static final int TRANSACTIOn_setData = IBinder.FIRST_CALL_TRANSACTIOn + 2;

IBinder对象
通过Stub.asInterface(service)获取IBinder对象,执行asInterface最后会返回new Proxy(binder)一个代理对象。

问题六:为什么Intent不能传递大数据(阿里)

限制大小: 1M - 8K
实际传递过程中比(1M - 8K)还要小些,数据还需要打包
就好像网络通信过程中数据会有包头、命令等
ProcessState.cp

ProcessState.cpp

如果在异步情况下,限制大小: (1M - 8K)/ 2
binder.c

proc->free_async_space = proc->buffer_size / 2;

native层,什么类代表binder? --> BBinder、JavaBBinder
java层,什么类代表binder?–> Binder
什么数据结构代表binder? --> binder_node结构体

补充:
AMS服务注册流程:
ServiceManagerProxy、BinderProxy、BpBinder、binder_ref是ServiceManager在不同层级的代理对象
Binder、JavaBBinder(继承BBinder)是ServiceManager在不同层级的实体对象

应用获取AMS服务流程:

整个流程


特别注意:如果服务端是AMS,则BinderProxy、BpBinder为AMS的代理对象

Binder相关面试题目相关推荐

  1. HTML/CS3相关面试题目

    一.HTML/CS3基本面试题目. 1. 常用那几种浏览器测试? 1.1浏览器:IE,Chrome(谷歌),FireFox(火狐),Safari(苹果计算机的最新操作系统Mac OS X中的浏览器,使 ...

  2. Binder相关面试总结(六):四大组件底层的通信机制是怎样的

    一.前言 这篇文章我酝酿了很久,参考了很多资料,读了很多源码,却依旧不敢下笔.生怕自己理解上还有偏差,对大家造成误解,贻笑大方.又怕自己理解不够透彻,无法用清晰直白的文字准确的表达出 Binder 的 ...

  3. Binder相关面试总结(三):Binder机制是如何跨进程的

    Android中进程和线程的关系和区别 线程是CPU调度的最小单元,同时线程是一种有限的系统资源:而进程一般指一个执行单元,在PC和移动设备上指一个程序或者一个应用. 进程有自己独立的地址空间,而进程 ...

  4. Binder相关面试总结(二):Binder到底是什么?

    Binder单从字面上理解,它有活页夹,粘合剂的意思,活页夹可以用来把两个东西夹在一起.在我们的Android系统中,Binder主要用来实现进程之间的通信(IPC),它的主要作用就是把多个App夹在 ...

  5. Binder相关面试总结(一):为什么Android要采用Binder作为IPC机制?

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nwy9SoNo-1609925310525)(//upload-images.jianshu.io/upload_ima ...

  6. 设计模式应用相关面试题目

    设计模式理论 1.什么是设计模式?你是否在你的代码里面使用过任何设计模式? 在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案. 平时 ...

  7. JavaScript 相关面试题目

    JavaScript 为什么javascript是单线程? 如果js是多线程的,在运行时多个线程同时对DOM元素进行操作,那具体以哪个线程为主就是个问题了 HTML5新的标准中允许使用new Work ...

  8. css/3的相关面试题目

    我的题目和答案皆来自于网络,不保证正确性哦 1,CSS 选择器有哪些?哪些属性可以继承?优先级算法如何计算? 1.id选择器(#myid)    2.类选择器(.myclassname)   3.标签 ...

  9. Binder相关面试总结(七):AIDL内部的实现原理是什么

    AIDL的作用是实现跨进程通讯使用方法也非常的简单,他的设计模式是典型的C/S架构.使用AIDL只要在Client端和Server端的项目根目录下面创建一个aidl的文件夹,在aidl文件夹的下面用j ...

最新文章

  1. python模拟登录qq账号密码_最新的Python模拟登陆QQ脚本,一键批量登录,强行过验证!...
  2. 部署Oracle数据库
  3. mysql二进制日志被删除无法启动_mysql二进制日志文件出错导致mysql服务无法启动...
  4. C++ priority_queue用法
  5. DELPHI获取网卡MAC地址 转
  6. matlab符号函数绘图法_matlab制图—符号函数(显函数、隐函数和参数方程)画图
  7. AndroidStudio意外崩溃,电脑重启,导致重启打开Androidstudio后所有的import都出错...
  8. animate.css –齐全的CSS3动画库--- 学习笔记
  9. 理解思科IPS系统的traffic flow notifications
  10. 服务器控件编程中的控件状态保存机制
  11. 深圳市区卫星地图 百度卫星地图高清版(含道路地名标签叠加)
  12. Mysql中修改字段类型、长度以及添加删除列
  13. 解决PD虚拟机下载ch341驱动 虚拟机学习单片机 MAC学习单片机
  14. Stata数据处理:清洗CFPS数据库
  15. Linux 复制文件
  16. Tmux(-yank,-cssh,-xpanes)使用指南
  17. const T 与T const的比较(const T vs.T const的翻译 Dan Saks)
  18. balsamiq原型工具
  19. 推荐好用的数据库软件sql studio
  20. HDU-6578 Blank(DP)2019暑假杭电多校第一场

热门文章

  1. SQL左连接,右连接,内连接简单例子
  2. edge中如何设置ssl.3是什么
  3. Bootstrap完成折叠效果(手风琴)
  4. 有人月薪八千,有人月薪三万五,都是人,为啥工资差别这么大?
  5. 自动调用拷贝构造函数的三种情况
  6. 微信分享(支付)和QQ分享
  7. birch聚类 java_用scikit-learn学习BIRCH聚类
  8. 调试经验——OBIEE报表开发实例小结(数据库直连DDR模式、日期型Prompt的设置...)
  9. [oeasy]python0043_八进制_oct_octal_october_octave
  10. 速锐得解码宝马B48远光灯结构总成设计电路控制DEMO方案