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

本文详细介绍了Android系统中的C/S架构,重点解析了Binder作为进程间通信机制的角色。Binder通信涉及服务器(Server)、服务管理器(ServiceManager)和客户端(Client)三部分,其中Server通过Binder注册服务,ServiceManager负责管理服务,Client则通过ServiceManager获取并使用服务。Binder通信结构分为三层,使得Android系统的组件能够有效地交互和协同工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

dbd2b835c4e3ace1ab5c3b824246ced0.png

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

8e1981043a1ba534b4dc625e6fc22648.png

2、Server

Server的工作示意图如下:

ca95e8e112c5d599085a113ae86ea353.png

下面是对上图的每个步骤的解释(在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的工作示意图如下:

ccc6a6854e75730626016733d68b196b.png

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方法传入字符串获取相应的服务并操作;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值