欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

「Android」 基于Binder通信的C/S架构体系认知

程序员文章站 2022-03-30 18:28:34
C/S架构(Client/Server,即客户机/服务器模式)分为客户机和服务器两层:第一层是在客户机系统上结合了表示与业务逻辑,第二层是通过网络结合了数据库服务器。简单的说就是第一层是用户表示层,第二层是数据库层。客户端和服务器直接相连,这两个组成部分都承担着重要的角色。 Android内核是基于 ......

  c/s架构(client/server,即客户机/服务器模式)分为客户机和服务器两层:第一层是在客户机系统上结合了表示与业务逻辑,第二层是通过网络结合了数据库服务器。简单的说就是第一层是用户表示层,第二层是数据库层。客户端和服务器直接相连,这两个组成部分都承担着重要的角色。

 

  android内核是基于linux系统, 而linux现存多种进程间ipc方式:管道, 消息队列, 共享内存, 套接字, 信号量, 信号。而android用的是binder来进行进程间通信。

  binder是android系统提供的一种ipc(进程间通信)机制。对于android系统,我们基本上可以把它看做一个基于binder通信的c/s架构,binder就像网络一样,把系统的各个部分连接在了一起,因此它是非常重要的。在android系统的c/s架构中除了client端和server端外,还有一个全局的servicemanager端,其作用是管理系统中的各种服务,三者的关系如下图:

  「Android」 基于Binder通信的C/S架构体系认知

  

1、binder的通信结构分为三层,如下图所示:

「Android」 基于Binder通信的C/S架构体系认知

 

2、server

server的工作示意图如下:

「Android」 基于Binder通信的C/S架构体系认知

下面是对上图的每个步骤的解释(在surfaceflinger的入口main函数的时候分析过):

1、初始化processstate:在初始化的过程中我们打开了binder虚拟设备,并使用mmap为其分配了内存,由于processstate是一个用了单例模式实现的类,因此每个进程只会打开设备一次;
2、getdefaultservicemanager:顾名思义,获取servicemanager。由于server此时是作为客户端,因此得到了bpservicemanager,bpservicemanager中含有bpbinder,其传入的handle为0,代表servicemanager的bbinder;
3、instantiate:使用bpservicemanager的addservice方法注册服务,以字符串标识自己的服务;
4、startthreadpool:这是一个可选的操作,当系统认为服务可能较为繁忙时才会创建多个线程,会为每个线程设置ipcthreadstate(用于通信),创建完后调用jointhreadpool
5、jointhreadpool:把当前线程加入线程池中,监听来自客户端的请求并处理,得到请求后通过executecommand方法来处理;
 

3、servicemanager

servicemanager的工作示意图如下:

「Android」 基于Binder通信的C/S架构体系认知

servicemanger的工作只有3步

binder_open:打开binder设备,与server在processstate初始化时进行的操作类似;
binder_become_contextt_manager:通过ioctl把自己的handle值设置为0,代表独一无二的manager;
binder_loop:进入一个循环监听请求,并作出响应的处理;


注:不是所有server进程都能往servicemanager中注册服务的,只有root或system级别的进程才有注册服务的权限。但servicemanager中还维护了一个allowed的白名单,上面注明了那些服务是允许被注册的,这些服务可以被任意server进程注册。

 

4、client

client使用服务只需要分为两步就好:
  (1)通过defaultservicemanager方法获取servicemanager;
  (2)通过servicemanager的getservice方法传入字符串获取相应的服务并操作;