太强了,大厂技术总监亲码“Android Binder原理”,知乎已1.3k赞,不吃透都对不起他

1 篇文章 0 订阅

1.为什么需要了解多进程呢?

其实一般项目我们都接触不到这个,我现在项目也接触不到,但是作为一个小咸鱼还是得有点小梦想,毕竟大公司的大项目不少都是多进程,所以基于此我们还是要了解的。(下面的图都是网上找来的)

2.进程间通信方式

进程间通信方式有蛮多种,比如通过共享内存、Socket、管道啊等等,但是我们作为安卓开发并不会采用这些(而且这块我也不懂,后续如果需要再研究呗),安卓中使用的是binder。至于区别,如下图。

用binder的优势:

  • 1.拷贝只需要一次,虽然有不需要拷贝的通信机制,但是就会涉及到信息资源时刻同步,这个是很耗性能的,而且控制极其复杂,易用性也差

  • 2.安全,因为为每个app分配UID(可以看作是应用的身份证)。

3.内存划分

想知道怎么传输数据的,需要先了解内存划分

4.Binder与传统IPC如何传输数据的呢?

binder与传统ipc(进程间通信机制)对比
传统ipc传输数据流程
一次拷贝:服务端一块空间(虚拟内存)跟内核空间(虚拟内存)通过MMP映射到同一块物理内存
无需拷贝:发送端、接收端、共享区域映射到同一块物理内存.(会涉及到各种信息资源同步,导致控制复杂、易用性差)

5.上层通过AIDL、底层通过Binder实现安卓端的进程通信,AIDL实现进程间通信流程

看了这些图大家可能还是没有深入理解,正好我最近薅到一份《Android Binder原理学习笔记》,集合了「Linux、C/S架构、ServiceManager、ProcessState、系统服务的注册过程、ServiceManager的启动过程、系统服务的获取过程、MediaPlayerService、JNI、Binder类的注册、AMS、JavaBBinder」等N多技术点。

目录:

一、学习Binder前必须要了解的知识点
二、ServiceManager中的Binder机制
三、系统服务的注册过程
四、ServiceManager的启动过程
五、系统服务的获取过程
六、Java Binder的初始化
七、Java Binder中系统服务的注册过程

一、学习Binder前必须要了解的知识点

1.Linux和Android的IPC机制种类
2.Linux和Binder的IPC通信原理
3.为什么要使用Binder
4.为什么要学习Binder?

二、ServiceManager中的Binder机制

1.基于Binder通信的C/S架构
2.MediaServer的main函数
3.每个进程唯一的ProcessState
4.ServiceManager中的Binder机制

三、系统服务的注册过程

1.从调用链角度说明MediaPlayerService是如何注册的
2.从进程角度说明MediaPlayerService是如何注册的

四、ServiceManager的启动过程

1.ServiceManager的入口函数
1.1 打开binder设备
1.2 注册成为Binder机制的上下文管理者
1.3 循环等待和处理client端发来的请求

五、系统服务的获取过程

1.客户端MediaPlayerService请求获取服务
2.服务端ServiceManager处理请求

六、Java Binder的初始化

1.Java Binder的JNI注册
1.1 Binder类的注册
1.2 BinderInternal类的注册

七、Java Binder中系统服务的注册过程

1.将AMS注册到ServiceManager
1.1 BinderInternal.getContextObject()
1.2 ServiceManagerNative.asInterface()
1.3 getIServiceManager().addService()

2.引出JavaBBinder
3.解析JavaBBinder
4.Java Binder架构

深入解析Binder源码

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是浮于表象,这对我们的知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读Android系统源码,还包括各种优秀的开源库。

所以这里为大家整理了Android开发相关源码精编解析,其中关于Binder的源码解析内容:

第一节 Binder 系列—开篇
第二节 Binder Driver 初探
第三节 Binder Driver 再探
第四节 Binder 启动 ServiceManager
第五节 获取 ServiceManager

由于篇幅原因,以上完整版资料PDF如有需要,可以 点赞+评论 支持下我,然后点击文末CSDN官方认证微信卡片免费阅读下载。

相关面试题解答

1、你是否了解Binder机制?

从手机启动过程中的一些进程阐述
Binder分层架构图
Binder的oneway和非oneway数据传递图
Binder的优缺点: 性能(拷贝一次)、安全(校验UID、PID)

2、Binder这么好用,那为什么Zygote的IPC通信机制用Socket而不用Binder?

如果用了binder,zygote要先启动binder机制,打开binder驱动,获得描述符,mmap进程内存映射,注册binder线程,还要创建一个binder对象注册到serviceManager,另外AMS要想zygote发起创建应用进程请求的话,要先从serviceManager查询zygote的binder对象,再发起binder调用,非常繁琐。

相比之下,zygote和systemserver本就是父子关系,对于简单的消息通信,用管道或者socket非常方便。

如果zygote用了binder机制,再fork systemServer,那systemServer就继承了zygote的描述符和映射的内存,这两个进程在binder驱动层就会共用一套数据结构,这肯定是不行的。那还得把旧的描述符关掉,再重新启动一遍binder机制,自找麻烦。

3、为什么说Binder是安全的?

在数据传输过程中有身份的校验,通过UID、PID进行校验

4、Intent跨进程传大图为什么会崩溃?

常规的intent传递数据,在startActivity时将Bundle的 allowFds 设置成了false, 然后就会将 Bitmap直接写到 Parcel 缓冲区。如果通过 bundle.putBinder形式传递Bitmap,会开辟一个块共享匿名内存用来存Bitmap的数据,而Parcel 缓冲区只是存储 FD 。

5、AIDL的oneWay和非oneway有什么区别?

oneway和非oneway的架构图,oneway server端是串行处理,异步调用,Client端不用休眠等待驱动返回数据。

文中资料点击文末CSDN官方认证微信卡片免费阅读下载↓↓↓

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Binder 机制是 Android 系统中的一种进程间通信(IPC)机制,用于在不同的进程之间传递数据和调用方法。它是 Android 系统中最重要的 IPC 机制之一,也是 Android 应用程序与系统服务进行通信的基础。 Binder 机制的工作原理是基于一个抽象的客户端-服务器模型。在 Binder 机制中,有三种角色:客户端、服务器和服务管理器。客户端和服务器在不同的进程中运行,而服务管理器运行在系统服务进程中。 当客户端需要与服务器通信时,它首先通过服务管理器获取服务器的引用。服务管理器通过一个名为 Binder 驱动的内核模块来实现进程间通信。客户端可以通过跨进程访问服务器对象来调用服务器上的方法,并将参数传递给服务器。服务器可以将结果返回给客户端。 Binder 机制的一个重要特性是它支持跨进程的对象引用。这意味着客户端可以获取服务器上的对象引用,并将其传递给其他进程中的客户端。通过这种方式,多个客户端可以共享服务器上的相同对象,并相互协作。 在 Android 应用程序中,开发者可以通过 AIDL(Android 接口定义语言)来定义客户端和服务器之间的接口。AIDL 可以生成一个 Java 接口和一个 C++ 接口,用于在客户端和服务器之间进行通信。 总之,Android Binder 机制是 Android 系统中用于进程间通信的核心技术之一。它提供了一种高效、灵活和安全的方式来在不同的进程之间传递数据和调用方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值