博客
关于我
Android Binder分析
阅读量:128 次
发布时间:2019-02-27

本文共 2270 字,大约阅读时间需要 7 分钟。

Binder通信模型详解

Binder通信模型是Android系统中用于进程间通信的核心机制,通过Client-Server架构实现高效、可靠的跨进程通信。其设计巧妙地结合了进程间通信的特点,提供了灵活且高效的通信解决方案。以下从多个维度详细阐述Binder的工作原理和实现方式。


一、Binder通信模型概述

Binder通信模型的核心组件包括Client、Server、ServiceManager和Binder驱动程序。其中,Client和Server分别作为通信的发送方和接收方,而ServiceManager则作为注册中心,帮助Client找到对应的Server。Binder驱动程序作为内核态的核心,负责进程间的通信管理。

从整体上看,Binder通信模型类似于互联网的DNS系统:ServiceManager充当域名服务器,为Client提供访问Server的入口,而Binder驱动程序则负责数据的传输和管理。


二、Binder驱动的核心作用

Binder驱动是Binder通信的核心,它运行在内核态,提供文件操作接口(如open、mmap、poll、ioctl等)。驱动注册在字符设备目录下的 /dev/binder,用户通过该设备目录访问Binder服务。

1. Binder驱动的功能

  • 通信建立:Binder驱动负责进程间Binder连接的建立。
  • 数据传输:管理数据包在进程间的传递。
  • 引用计数:跟踪Binder实体的引用数量,确保内核空间的正确管理。
  • 协议处理:通过ioctl接口实现灵活的协议交互。

2. Binder驱动的实现

Binder驱动的实现遵循C/S架构,服务端(Server)通过Binder驱动提供接口,客户端(Client)通过这些接口发起请求。驱动代码通常位于内核空间,例如Android的binder.c文件中。


三、ServiceManager的功能与实现

ServiceManager是Binder通信模型中的注册中心,类似于DNS服务器。它负责将Binder实体的名字与对应的引用绑定,方便Client通过名字查询服务。

1. ServiceManager的工作流程

  • 注册:Server向ServiceManager注册Binder实体及其名字。
  • 查询:Client通过名字向ServiceManager查询对应的Binder引用。
  • 管理:ServiceManager维护一个查找表,记录所有已注册的Binder实体。
  • 2. 实名Binder与匿名Binder

    • 实名Binder:Server必须向ServiceManager注册,通过名字查询。
    • 匿名Binder:Server可以直接传递给Client,无需注册,提供私密通道。

    3. ServiceManager的实现细节

    ServiceManager和Binder驱动通信的关键在于Binder的引用管理。例如,BINDER_SET_CONTEXT_MGR命令用于将ServiceManager设置为Binder的上下文管理器,确保系统唯一性。


    四、Parcel数据载体

    Parcel是Binder通信的数据载体,用于跨进程传输数据和对象引用。它支持高效的数据打包和重组,适用于复杂的 IPC 通信场景。

    1. Parcel的结构

    • 数据缓冲区:用于存储传输数据。
    • 位置和容量:支持随机访问和动态扩展。
    • 接口定义:提供丰富的操作接口,方便开发者使用。

    2. 数据传输协议

    Parcel的数据传输遵循严格的协议,确保写入和读取的一致性。例如,Primitive Arrays的传输包含数据大小和数据内容,避免了多次内存拷贝带来的性能损失。


    五、ServiceManager的C实现

    ServiceManager的C/C++实现位于内核空间,主要包括以下几个部分:

    1. ServiceManager的主函数

    • binder_loop:处理客户端的请求,根据事务类型(如GET_SERVICE、ADD_SERVICE)调用相应的处理函数。
    • svcmgr_handler:具体处理ServiceManager的事务,例如查询或添加服务。

    2. 事务处理

    ServiceManager支持多种事务类型:

    • GET_SERVICE:查询服务名对应的Binder引用。
    • ADD_SERVICE:将新的Binder实体注册到ServiceManager。

    六、应用实例:ServiceManagerProxy

    在用户空间,ServiceManagerProxy作为ServiceManager的代理,提供简便的接口供应用程序使用。例如,通过getService方法,客户端可以快速获取所需服务的Binder引用。


    七、性能优化与资源管理

    Binder通信模型通过减少内存拷贝的次数,显著提升了通信效率。例如,通过共享内核缓存,减少了数据在内核空间和用户空间之间的拷贝操作。

    1. IPC方式的优化

    • Socket:适用于跨网络通信,但效率较低。
    • 消息队列和管道:存储转发方式,效率较低。
    • 共享内存:控制复杂,难以使用。

    2. Binder的优化策略

    • 减少拷贝:只需将数据拷贝一次到内核缓存。
    • C/S架构:便于管理和扩展。

    八、结语

    Binder通信模型通过灵活的协议和高效的数据传输机制,实现了进程间通信的高效与安全。其核心组件包括Binder驱动、ServiceManager和Parcel载体,共同构建了Android系统中高性能的IPC通信体系。

    转载地址:http://ibjb.baihongyu.com/

    你可能感兴趣的文章
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
    查看>>
    NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
    查看>>