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

    你可能感兴趣的文章
    NuGet(微软.NET开发平台的软件包管理工具)在VisualStudio中的安装的使用
    查看>>
    nuget.org 无法加载源 https://api.nuget.org/v3/index.json 的服务索引
    查看>>
    Nuget~管理自己的包包
    查看>>
    NuGet学习笔记001---了解使用NuGet给net快速获取引用
    查看>>
    nullnullHuge Pages
    查看>>
    NullPointerException Cannot invoke setSkipOutputConversion(boolean) because functionToInvoke is null
    查看>>
    null可以转换成任意非基本类型(int/short/long/float/boolean/byte/double/char以外)
    查看>>
    Number Sequence(kmp算法)
    查看>>
    Numix Core 开源项目教程
    查看>>
    numpy
    查看>>
    NumPy 库详细介绍-ChatGPT4o作答
    查看>>
    NumPy 或 Pandas:将数组类型保持为整数,同时具有 NaN 值
    查看>>
    numpy 或 scipy 有哪些可能的计算可以返回 NaN?
    查看>>
    numpy 数组 dtype 在 Windows 10 64 位机器中默认为 int32
    查看>>
    numpy 数组与矩阵的乘法理解
    查看>>
    NumPy 数组拼接方法-ChatGPT4o作答
    查看>>
    numpy 用法
    查看>>
    Numpy 科学计算库详解
    查看>>
    Numpy.fft.fft和numpy.fft.fftfreq有什么不同
    查看>>
    numpy.linalg.norm(求范数)
    查看>>