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

    你可能感兴趣的文章
    SQL Server 复制 订阅与发布
    查看>>
    OSPF技术连载20:OSPF 十大LSA类型,太详细了!
    查看>>
    OSPF技术连载21:OSPF虚链路,现代网络逻辑连接的利器!
    查看>>
    OSPF技术连载22:OSPF 路径选择 O > O IA > N1 > E1 > N2 > E2
    查看>>
    Padding
    查看>>
    paddlehub安装及对口罩检测
    查看>>
    paddle的两阶段基础算法基础
    查看>>
    SpringBoot中重写addCorsMapping解决跨域以及提示list them explicitly or consider using “allowedOriginPatterns“ in
    查看>>
    PageHelper 解析及实现原理
    查看>>
    pageHelper分页工具的使用
    查看>>
    PageHelper:上手教程(最详细)
    查看>>
    PageOffice如何实现从零开始动态生成图文并茂的Word文档
    查看>>
    PageRank算法
    查看>>
    Paint类(画笔)
    查看>>
    paip.android 手机输入法制造大法
    查看>>
    paip.spring3 mvc servlet的配置以及使用最佳实践
    查看>>
    Palindrome Number leetcode java
    查看>>
    Palo Alto Networks Expedition 未授权SQL注入漏洞复现(CVE-2024-9465)
    查看>>
    Palo Alto Networks PAN-OS身份认证绕过导致RCE漏洞复现(CVE-2024-0012)
    查看>>
    Panalog 日志审计系统 libres_syn_delete.php 前台RCE漏洞复现
    查看>>