Android Binder 的主要内容概述以及特性和原理,Android 开发前景怎么样
3.1 性能?
[图片上传失败…(image-675747-1628086130715)]
共享内存虽然无需拷贝,但控制复杂,难以使用。
Binder 只需要一次数据拷贝,性能上仅次于共享内存。
Socket 作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。
消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。
3.2 稳定性?
Binder 基于 C/S 架构,客户端(Client)有什么需求就丢给服务端(Server)去完成,架构清晰、职责明确又相互独立,自然稳定性更好。
共享内存虽然无需拷贝,但是控制负责,难以使用。从稳定性的角度讲,Binder 机制是优于内存共享的。
3.3 安全性?
首先传统的 IPC 接收方无法获得对方可靠的进程用户 ID/进程 ID(UID/PID),从而无法鉴别对方身份。
Android 为每个安装好的 APP 分配了自己的 UID,故而进程的 UID 是鉴别进程身份的重要标志。传统的 IPC 只能由用户在数据包中填入 UID/PID,但这样不可靠,容易被恶意程序利用。可靠的身份标识只有由 IPC 机制在内核中添加。其次传统的 IPC 访问接入点是开放的,只要知道这些接入点的程序都可以和对端建立连接,不管怎样都无法阻止恶意程序通过猜测接收方地址获得连接。
同时 Binder 既支持实名 Binder,又支持匿名 Binder,安全性高(Binder.getCallingUid())。
3.4 结论:
[图片上传失败…(image-a27659-1628086130715)]
[图片上传失败…(image-7a3593-1628086130715)]
1.进程隔离
进程与进程间内存是不共享的。两个进程就像两个平行的世界,A 进程没法直接访问 B 进程的数据,这就是进程隔离的通俗解释。
A 进程和 B 进程之间要进行数据交互就得采用特殊的通信机制:进程间通信(IPC)。
2.用户空间与内核空间
每个 Android 的进程,只能运行在自己进程所拥有的虚拟地址空间。对应一个 4GB 的虚拟地址空间,其中 3GB 是用户空间,1GB 是内核空间,当然内核空间的大小是可以通过参数配置调整的。对于用户空间,不同进程之间彼此是不能共享的,而内核空间却是可共享的。
简单的说就是,内核空间(Kernel)是系统内核运行的空间,用户空间(User Space)是用户程序运行的空间。为了保证安全性,它们之间是隔离的。
3.用户态与内核态
虽然从逻辑上抽离出用户空间和内核空间;但是不可避免的的是,总有那么一些用户空间需要访问内核的资源;比如应用程序访问文件,网络是很常见的事情,怎么办呢?
当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(内核态)此时处理器处于特权级最高的(0 级)内核代码中执行。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3 级)用户代码中运行。处理器在特权等级高的时候才能执行那些特权 CPU 指令。
系统调用主要通过如下两个函数来实现:
copy_from_user() //将数据从用户空间拷贝到内核空间
copy_to_user() //将数据从内核空间拷贝到用户空间
复制代码
4.1 Binder 组成
[图片上传失败…(image-590516-1628086130715)]
Binder 是基于 C/S 架构的。由一系列的组件组成,包括 Client、Server、ServiceManager、Binder 驱动。其中 Client、Server、Service Manager 运行在用户空间,Binder 驱动运行在内核空间。其中 Service Manager 和 Binder 驱动由系统提供,而 Client、Server 由应用程序来实现。Client、Server 和 ServiceManager 均是通过系统调用 open、mmap 和 ioctl 来访问设备文件 /dev/binder,从而实现与 Binder 驱动的交互来间接的实现跨进程通信。
Client
如同互联网中客户端(Client),Binder 是 Server 本地对象的一个引用,这个引用实际上是一个代理对象,Client 通过这个代理对象来间接访问 Server 的本地对象;
Server
如同互联网中服务器(Server),Binder 是提供具体实现的本地对象,需向 ServiceManager 注册;
ServiceManager
如同互联网中 DNS 域名服务器(ServiceManager),管理 Servive 注册和查询,作用是将字符形
式的 Binder 名字转化成 Client 中对该 Binder 的引用,使得 Client 能够通过 Binder 的名字获得对 Binder 实体的引用。注册了名字的 Binder 叫实名 Binder,就像网站一样除了除了有 IP 地址意外还有自己的网址。
驱动
如同互联网中路由器(Binder 驱动),是整个通信的核心;驱动负责进程之间 Binder 通信的建立,Binder 在进程之间的传递,Binder 引用计数管理,数据包在进程之间的传递和交互等一系列底层支持。
4.2 Binder 架构
[图片上传失败…(image-a6a75d-1628086130715)]
Binder 架构采用分层架构设计,每一层都有其不同的功能,以大家平时用的 startService 为例子,AMP 为 ActivityManagerProxy,AMS 为 ActivityManagerSerivce。BpBinder 是 Client 端创建的用于向 Server 发送消息的代理,而 BBinder 是 Server 端用于接受消息的通道。
Binder 通信采用 C/S 架构,从组件视角来说,包含 Client、 Server、 ServiceManager 以及 Binder 驱动,其中 ServiceManager 用于管理系统中的各种服务。
Binder 在 framework 层进行了封装,通过 JNI 技术调用 Native(C/C++)层的 Binder 架构。
Native 层: 对于 Native 层,如果需要使用 Binder,则可以直接使用 BpBinder 和 BBinder(也包括 JavaBBindder)即可,对于上一层 Java IPC 通信也是基于这个层面。
Kernel 物理层:这里是 Binder Driver,前面三层都跑在用户控件,对于用户控件内存资源是不共享的,每个 Android 的进程只能运行在自己基础讷航所拥有的虚拟地址空间,而内核空间却是可共享的。真正通信的核心环节还是 Binder Driver。
4.3 Binder 机制通讯原理
[图片上传失败…(image-f6d2dc-1628086130715)]
评论