博客
关于我
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/

    你可能感兴趣的文章
    python | xlsxwriter,一个实用的 Python 库!
    查看>>
    python | xlwings,一个非常实用的 Excel 相关的 Python 库!
    查看>>
    python读取含中文的json
    查看>>
    python | 提升代码迭代速度的Python重载方法
    查看>>
    python | 深入理解Python并发编程中的GIL限制与解决方案
    查看>>
    Python | 爬虫实战——亚马逊搜索页监控(附详细源码)
    查看>>
    python | 高效使用Python工具自动生成模块文档的秘诀
    查看>>
    python 一个list去除另一个list中的值
    查看>>
    python 三大框架的 介绍。
    查看>>
    Python 下载的 11 种姿势,一种比一种高级!
    查看>>
    python读取一个文件夹下所有图片_初学Python-找出文件夹下的所有图片
    查看>>
    Python 中 3 个不可思议的返回功能
    查看>>
    python 中 dict 的另一种用法
    查看>>
    Python 中 PIL 读取图片出现异常旋转的解决方法
    查看>>
    Python 中只有一个 True 和一个 False 对象吗?
    查看>>
    python读取mtcars数据集并实现以下操作_关于数据处理。。,Python交流,技术交流区,鱼C论坛 - Powered by Discuz!...
    查看>>
    Python 中多线程与多处理之间的区别
    查看>>
    Python 中如何使用 lambda 函数
    查看>>
    Python 中如何创建多行字符串?
    查看>>
    Python 中如何处理异常?
    查看>>