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

    你可能感兴趣的文章
    Nginx 动静分离与负载均衡的实现
    查看>>
    Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
    查看>>
    nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
    查看>>
    Nginx 反向代理解决跨域问题
    查看>>
    Nginx 反向代理配置去除前缀
    查看>>
    nginx 后端获取真实ip
    查看>>
    Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
    查看>>
    Nginx 常用配置清单
    查看>>
    nginx 常用配置记录
    查看>>
    Nginx 我们必须知道的那些事
    查看>>
    Nginx 的 proxy_pass 使用简介
    查看>>
    Nginx 的配置文件中的 keepalive 介绍
    查看>>
    Nginx 负载均衡与权重配置解析
    查看>>
    Nginx 负载均衡详解
    查看>>
    nginx 配置 单页面应用的解决方案
    查看>>
    nginx 配置https(一)—— 自签名证书
    查看>>
    nginx 配置~~~本身就是一个静态资源的服务器
    查看>>
    Nginx 配置解析:从基础到高级应用指南
    查看>>
    Nginx下配置codeigniter框架方法
    查看>>
    nginx报错:the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:128
    查看>>