查看: 1349|回复: 39

[Android教程] 基于Binder通信的C/S架构体系认知

[复制链接]
  • TA的每日心情
    无聊
    7 小时前
  • 签到天数: 42 天

    [LV.5]常住居民I

    151

    主题

    208

    帖子

    4825

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    4825

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

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

      Android内核是基于Linux系统, 而Linux现存多种进程间IPC方式:管道, 消息队列, 共享内存, 套接字, 信号量, 信号。而Android用的是Binder来进行进程间通信。
      Binder是Android系统提供的一种IPC(进程间通信)机制。对于Android系统,我们基本上可以把它看做一个基于Binder通信的C/S架构,Binder就像网络一样,把系统的各个部分连接在了一起,因此它是非常重要的。在Android系统的C/S架构中除了Client端和Server端外,还有一个全局的ServiceManager端,其作用是管理系统中的各种服务,三者的关系如下图:
      

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

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

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

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

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

    2、Server
    Server的工作示意图如下:

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

    基于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的工作示意图如下:

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

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

    帖子地址: 

  • TA的每日心情
    郁闷
    2019-8-16 23:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    12

    帖子

    127

    积分

    Lv 2:论坛新兵

    Rank: 1

    积分
    127
    发表于 2018-11-19 10:33:17 | 显示全部楼层
    哈哈 这个的确如此啊
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    7 天前
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    6

    帖子

    121

    积分

    Lv 2:论坛新兵

    Rank: 1

    积分
    121
    发表于 2018-11-19 10:33:21 | 显示全部楼层
    秀起来~
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    5

    帖子

    113

    积分

    Lv 2:论坛新兵

    Rank: 1

    积分
    113
    发表于 2018-11-19 10:43:59 | 显示全部楼层
    大家都不容易!
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    8

    帖子

    113

    积分

    Lv 2:论坛新兵

    Rank: 1

    积分
    113
    发表于 2018-11-19 10:44:05 | 显示全部楼层
    围观楼主。。。。
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2019-8-26 11:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    7

    帖子

    122

    积分

    尊贵vip会员

    Rank: 5Rank: 5

    积分
    122
    发表于 2018-11-19 10:44:56 | 显示全部楼层
    前排,哇咔咔
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    12

    帖子

    113

    积分

    Lv 2:论坛新兵

    Rank: 1

    积分
    113
    发表于 2018-11-19 10:54:53 | 显示全部楼层
    看他们心情啊~
    回复

    使用道具 举报

  • TA的每日心情

    3 天前
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    14

    帖子

    129

    积分

    Lv 2:论坛新兵

    Rank: 1

    积分
    129
    发表于 2018-11-19 11:01:56 | 显示全部楼层
    在撸一遍。。。
    回复

    使用道具 举报

  • TA的每日心情

    1565968516
  • 签到天数: 1 天

    0

    主题

    10

    帖子

    113

    积分

    Lv 2:论坛新兵

    Rank: 1

    积分
    113
    发表于 2018-11-19 11:04:50 | 显示全部楼层
    看楼下的解答。。。。
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-10-8 14:15
  • 签到天数: 2 天

    [LV.1]初来乍到

    0

    主题

    12

    帖子

    133

    积分

    尊贵vip会员

    Rank: 5Rank: 5

    积分
    133
    发表于 2018-11-19 11:08:49 | 显示全部楼层
    溜达一下。。。今天上班的···
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    快速回复 返回顶部 返回列表