「Android」 基于Binder通信的C/S架构体系认知
C/S架构(Client/Server,即客户机/服务器模式)分为客户机和服务器两层:第一层是在客户机系统上结合了表示与业务逻辑,第二层是通过网络结合了数据库服务器。简单的说就是第一层是用户表示层,第二层是数据库层。客户端和服务器直接相连,这两个组成部分都承担着重要的角色。
Android内核是基于Linux系统, 而Linux现存多种进程间IPC方式:管道, 消息队列, 共享内存, 套接字, 信号量, 信号。而Android用的是Binder来进行进程间通信。
Binder是Android系统提供的一种IPC(进程间通信)机制。对于Android系统,我们基本上可以把它看做一个基于Binder通信的C/S架构,Binder就像网络一样,把系统的各个部分连接在了一起,因此它是非常重要的。在Android系统的C/S架构中除了Client端和Server端外,还有一个全局的ServiceManager端,其作用是管理系统中的各种服务,三者的关系如下图:
1、Binder的通信结构分为三层,如下图所示:
2、Server
Server的工作示意图如下:
下面是对上图的每个步骤的解释(在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的工作示意图如下:
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方法传入字符串获取相应的服务并操作;
「Android」 基于Binder通信的C/S架构体系认知的更多相关文章
- Android系统是一个基于BInder通信的C/S架构
Android系统基本上可以看作是一个基于Binder通信的C/S架构.他有服务器端和客户端.比如自己开发一个程序,肯定是基于Activity的而Activity就是作为客户端,他的服务器端就是Act ...
- 从AIDL开始谈Android进程间Binder通信机制
转自: http://tech.cnnetsec.com/585.html 本文首先概述了Android的进程间通信的Binder机制,然后结合一个AIDL的例子,对Binder机制进行了解析. 概述 ...
- 基于golang分布式爬虫系统的架构体系v1.0
基于golang分布式爬虫系统的架构体系v1.0 一.什么是分布式系统 分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统.简单来说就是一群独立计算机 ...
- Android 中基于 Binder的进程间通信
摘要:对 Binder 工作机制进行了分析. 首先简述 Android 中 Binder 机制与传统的 Linux 进程间的通信比较,接着对基于 Binder 进程间通信的过程分析 最后结合开发实例 ...
- 「Android」 Surface分析
本篇针对Surface模块进行分析,从Java层的Activity创建开始,到ViewRoot.WindowsManagerService,再到JNI层和Native层. 首先推荐一个Android源 ...
- 「Android」SurfaceFlinger分析
本篇针对surfaceFlinger模块进行分析,目录如下: 1.SurfaceFlinger功能 1.1.BufferQueue原理(native/libs/gui模块) 1.2 layer显示 ...
- 「Android」GreenDao
译文 版本:greenDAO 3.2.2 官网:http://greenrobot.org/greendao/ GitHub:https://github.com/greenrobot/greenDA ...
- 「Android」adb调试源码(针对dumpsys SurfceFlinger、trace.txt获取)
首先对ADB作简单的阐述,接下来对adb shell dumpsys SurfaceFlinger服务的dump信息的查看.以及ANR问题如何获取trace文件并简单分析. -×*********** ...
- 「Android」系统架构概述
目录: 1.Android系统架构 2.Android类库 3.四大组件 --------------------------------------------------------------- ...
随机推荐
- 性能瓶颈之Session
如果Source,Target和Mapping都不存在性能上的瓶颈,则问题可能会出在Session 以下问题可导致Session有性能上的瓶颈 1) 缓存小 2) 缓冲内存小 3) commit提交间 ...
- Docker面试题
1.如何列出可运行的容器?docker ps 2.启动nginx容器(随机端口映射),并挂载本地文件目录到容器html的命令是?docker run -d -P --name nginx2 -v /h ...
- session的一些笔记
HttpSession hs = request.getSession();//以键值对方式存储数据在session中hs.setAttribute("code", code);/ ...
- windows关闭占用某端口的进程
第一步:获取该端口进程PID 第二步:获取该PID进程映像名称 第三部:关闭进程
- JsonBuilder初出茅庐
互联网这股东风不久前刮到了甘凉国,国王老甘独具慧眼,想赶紧趁着东风未停大力发展移动互联网,因为他笃信布斯雷的理论:“站在风口上,猪都能飞起来”.无奈地方偏僻落后,国内无可用之才啊.老甘一筹莫展的低头凝 ...
- MyBatis源码解析(六)——DataSource数据源模块之池型数据源
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6675674.html 1 回顾 上一文中解读了MyBatis中非池型数据源的源码,非池型也 ...
- 记一次SpringBoot 开发中所遇到的坑和解决方法
记一次SpringBoot 开发中所遇到的坑和解决方法 mybatis返回Integer为0,自动转型出现空指针异常 当我们使用Integer去接受数据库中表的数据,如果返回的数据中为0,那么Inte ...
- 使用meterpreter让没有安装python解释器的肉鸡设备执行任意python程序
目标设备不需安装python解释器就能让其执行python程序 # 需要在与目标meterpreter的session中加载python模块 meterpreter > load python ...
- Linux之定时任务Crond使用
Linux之定时任务Crond使用 一.用法 crond服务是linux系统自带的服务,是不需要手动安装的: crond服务是一种守护进程: Linux中的用户使用contab命令来配置corn任务: ...
- 海量数据处理之BitMap
有这样一种场景:一台普通PC,2G内存,要求处理一个包含40亿个不重复并且没有排过序的无符号的int整数,给出一个整数,问如果快速地判断这个整数是否在文件40亿个数据当中? 问题思考: 40亿个int ...