B2HGraphicBufferProducer和H2BGraphicBufferProducer

ops/2024/12/28 18:18:42/

在 Android 的图形系统中,B2HGraphicBufferProducerBnGraphicBufferProducer 是基于 Binder 机制的两个重要组件,它们负责图形缓冲区的生产接口。二者关系可以理解为 桥接和实现分离,以下是详细说明:

1. B2HGraphicBufferProducer

B2HGraphicBufferProducer 是一个中间桥接类,它的主要功能是将 HAL(硬件抽象层)的 IGraphicBufferProducer 实现桥接为 IGraphicBufferProducer Binder 接口,使其能通过 Binder IPC 机制进行通信。

  • 典型位置: 位于 hardware/interfaces/graphics/allocator 或相关 HAL 接口中,提供跨进程桥接能力。

  • 主要用途

    • 将图形缓冲区生产逻辑从底层(硬件驱动/HAL)桥接到 Android 的图形栈。
    • 通常配合其他硬件接口,比如 HGraphicBufferProducer,用于整合 HAL 层资源。
  • 关键特性B2HGraphicBufferProducer 作用类似于适配器,将传统 HAL 中的缓冲区生产逻辑转换为面向高层的 Binder 调用。


2. BnGraphicBufferProducer

BnGraphicBufferProducerIGraphicBufferProducer 的具体 Binder 服务端实现,用于在服务端处理来自客户端的 Binder 调用。

  • 主要用途

    • 实现 Binder IPC 的服务端逻辑。
    • 处理 IGraphicBufferProducer 接口定义的所有方法,比如缓冲区分配、回收、提交。
  • 实现方式BnGraphicBufferProducer 通常通过继承接口并覆写其方法,直接对请求进行处理。例如:

    class BnGraphicBufferProducer : public BnInterface<IGraphicBufferProducer> {
    public:// Override the methods declared in IGraphicBufferProducerstatus_t allocateBuffer(...);status_t detachBuffer(...);
    };
    


3. 它们之间的关系

  1. 桥接角色:B2HGraphicBufferProducer
    B2HGraphicBufferProducer 不直接实现 IGraphicBufferProducer 的逻辑,而是将这些接口转换为 Binder 层接口调用。这使得 HAL 层可以通过 IPC 与高层组件通信。

  2. 服务端实现:BnGraphicBufferProducer
    BnGraphicBufferProducer 提供了 IGraphicBufferProducer 接口在服务端的具体实现,处理 Binder 层的调用请求。

  3. 实际通信流

    • 客户端:通过 BpGraphicBufferProducer 调用 Binder 接口发送请求。
    • 桥接B2HGraphicBufferProducer 将请求解析后调用 HAL 提供的具体实现。
    • 服务端BnGraphicBufferProducer 对接 HAL 或处理逻辑完成任务。

4. 示例对比

// B2HGraphicBufferProducer 示例:作为桥接实现 HAL 对高层的 Binder 接口
class B2HGraphicBufferProducer : public HGraphicBufferProducer {
public:B2HGraphicBufferProducer(sp<IGraphicBufferProducer> producer) : mProducer(producer) {}Return<void> requestBuffer(int32_t slot, requestBuffer_cb _hidl_cb) override {// 转发 Binder 调用到具体的 HAL 层 producermProducer->requestBuffer(slot, ...);}private:sp<IGraphicBufferProducer> mProducer; // 持有 HAL 实现
};// BnGraphicBufferProducer 示例:作为服务端处理 Binder 调用
class BnGraphicBufferProducer : public BnInterface<IGraphicBufferProducer> {status_t allocateBuffer(...) override {// 实现缓冲区分配逻辑}status_t detachBuffer(...) override {// 实现缓冲区分离逻辑}
};

5. 关键区别

特性B2HGraphicBufferProducerBnGraphicBufferProducer
角色桥接 HAL 和 Binder服务端实现接口
实现方式适配 IGraphicBufferProducer 的 HAL 实现处理客户端 IGraphicBufferProducer 调用
典型场景用于硬件资源桥接用于服务端管理 BufferProducer 接口
定位中间桥梁服务端逻辑

6. B2HGraphicBufferProducer 的作用

B2HGraphicBufferProducer 是一个适配器(或桥接)类,它将 HAL 层实现与高层 Binder 接口连接起来,通常运行在服务端进程中。

核心职责:
  • 桥接 HAL 的 HGraphicBufferProducer 与 Framework 的 IGraphicBufferProducer
  • 运行在 服务端,用于调用具体的 HAL 实现。
 
Framework (e.g., SurfaceFlinger)↕Binder (IGraphicBufferProducer)↕B2HGraphicBufferProducer (桥接 HAL 和 IGraphicBufferProducer)↕HGraphicBufferProducer (HAL 层具体实现)

示例调用路径:
  • 客户端发起调用,经过 BpGraphicBufferProducer 和 Binder IPC,最终到达 BnGraphicBufferProducer
  • BnGraphicBufferProducer 实现调用 B2HGraphicBufferProducer,桥接到 HAL 层处理。

7. 客户端到服务端的调用流

举例以 IGraphicBufferProducer::queueBuffer() 为例:

  1. 客户端进程调用 BpGraphicBufferProducer::queueBuffer()
  2. Binder 将调用请求发送到服务端的 BnGraphicBufferProducer
  3. 在服务端,BnGraphicBufferProducer 负责处理:
    • 如果是 HAL 请求,转发到 B2HGraphicBufferProducer,再桥接到 HAL 实现。
    • 如果是 Framework 内部逻辑,由 SurfaceFlinger 或其他服务直接处理。

具体调用路径可能类似:

客户端:BpGraphicBufferProducer::queueBuffer()↕
Binder IPC↕
服务端:BnGraphicBufferProducer::queueBuffer()↕如果目标为 HAL 层:调用 B2HGraphicBufferProducer::queueBuffer()↕HGraphicBufferProducer::queueBuffer()

=========================================================================

引入 H2BGraphicBufferProducer 的原因,通常是在 服务端和客户端 的不同层次之间,进一步桥接和适配新的硬件抽象层(HAL)。它与 B2HGraphicBufferProducer 相辅相成,作用和职责可以更好地说明图形栈的调用流程。


1. 角色简介

H2BGraphicBufferProducer
  • H2B:HAL(Hardware Abstraction Layer)到 Binder。
  • 桥接 硬件实现(HAL层)Framework 层的 Binder IPC 接口
  • 作用与 B2HGraphicBufferProducer 相反
    • 它将 HAL 层的实现 转化为可供 Binder 调用的接口,主要用于服务端。
    • HAL 层提供图形生产接口(如 HGraphicBufferProducer),H2BGraphicBufferProducer 将这些实现包装为可由高层使用的 IGraphicBufferProducer
B2HGraphicBufferProducer
  • B2H:Binder 到 HAL。
  • 桥接 Binder IPC(高层接口调用)HAL层的实现
  • 它将 Binder IPC 的调用 转发到具体 HAL 层接口执行,主要服务于服务端或者某些情况下的代理调用。

2. 桥接关系与数据流

可以总结如下流程:

 
客户端调用        H2B                                 服务端处理     B2H                              HAL层
App --> BpGraphicBufferProducer --> H2BGraphicBufferProducer --> BnGraphicBufferProducer --> B2HGraphicBufferProducer --> HGraphicBufferProducer


3. 两者的分工

特性H2BGraphicBufferProducerB2HGraphicBufferProducer
方向HAL 层向 Framework 层提供接口桥接Framework 层向 HAL 层请求执行桥接
接口类型提供 IGraphicBufferProducer 实现,供 Binder 使用使用 HAL 提供的 HGraphicBufferProducer 实现,将调用委托给 HAL 层实现
运行位置服务端,通常在 Binder 服务端处理逻辑 的高层接口服务端,也负责与 HAL 紧密交互
作用让 HAL 层的具体实现作为 Binder 服务暴露给客户端调用 HAL 层的具体实现,并将结果传递回 Framework 层

4. 如何理解调用流

在 Android 图形栈的某些情况下,这种双向桥接实现(H2B 和 B2H)是为了让服务端既能够作为一个 Binder 服务暴露给客户端,又能直接与硬件(HAL)通信,统一管理图形缓冲区的生产、分发和使用。

queueBuffer 为例:
  1. 客户端调用

    • 客户端(如应用或 Framework)通过 BpGraphicBufferProducer 发起 queueBuffer 调用。
    • Binder 将调用请求转发到服务端。
  2. H2BGraphicBufferProducer

    • 服务端的 H2BGraphicBufferProducer(如果存在)会接收客户端调用,并包装 HAL 提供的实现接口。
  3. BnGraphicBufferProducer

    • BnGraphicBufferProducer 作为 Binder 服务端核心入口,接收并解析客户端调用。
  4. B2HGraphicBufferProducer

    • 在 Binder 处理完服务端业务后,调用 HAL 层逻辑,通过 B2HGraphicBufferProducerqueueBuffer 调用转发到 HGraphicBufferProducer
  5. HAL 层实现

    • HGraphicBufferProducer 在 HAL 层实现实际的 queueBuffer 逻辑,并返回结果。

5. 两者协作的代码层面分析

(1) H2BGraphicBufferProducer 的伪代码示例:
 
class H2BGraphicBufferProducer : public IGraphicBufferProducer {
private:sp<HGraphicBufferProducer> mHalImpl; // 保存 HAL 实现类实例public:H2BGraphicBufferProducer(const sp<HGraphicBufferProducer>& halImpl) : mHalImpl(halImpl) {}virtual status_t queueBuffer(int slot, const QueueBufferInput& input,QueueBufferOutput* output) override {// 转发 HAL 的实现供 Framework 调用return mHalImpl->queueBuffer(slot, input, output);}
};

(2) B2HGraphicBufferProducer 的伪代码示例:
 
class B2HGraphicBufferProducer : public HGraphicBufferProducer {
private:sp<IGraphicBufferProducer> mBinderImpl; // 保存高层 Binder 接口实现public:B2HGraphicBufferProducer(const sp<IGraphicBufferProducer>& binderImpl) : mBinderImpl(binderImpl) {}virtual status_t queueBuffer(int slot, const QueueBufferInput& input,QueueBufferOutput* output) override {// 转发 Binder 的调用至高层逻辑return mBinderImpl->queueBuffer(slot, input, output);}
};


6. 示例调用链

以下是完整的调用链可能情况:

(a) 客户端到服务端:
  1. 客户端调用 BpGraphicBufferProducer::queueBuffer
  2. 服务端 BnGraphicBufferProducer::onTransact 接收调用并分发到:
    • 桥接类 H2BGraphicBufferProducer 中。
    • 或服务端直接处理。
(b) 服务端调用 HAL:
  1. 服务端逻辑中,调用 B2HGraphicBufferProducer::queueBuffer
  2. 最终,调用 HAL 的 HGraphicBufferProducer

7. 总结

  1. H2BGraphicBufferProducer 是一个 HAL 转 Binder 的桥接器,用于服务端。
  2. B2HGraphicBufferProducer 是一个 Binder 转 HAL 的桥接器,用于连接 Binder 层与 HAL 层。
  3. 调用路径依赖场景设计,主要方向是:
    • 客户端调用到 Framework 或 HALBpGraphicBufferProducer -> H2BGraphicBufferProducer
    • Framework 调用 HAL 实现B2HGraphicBufferProducer -> HGraphicBufferProducer

 实际情况:

在Android 14的代码里,这两个类似乎没怎么在surfaceflinger或者说graphics模块上有太多用处,反而是在Camera和Video模块里有new过这两个类。

另外,H2BGraphicBufferProducer 类的父类定义在:system/libhidl目录下,可自行查找。


http://www.ppmy.cn/ops/144614.html

相关文章

flink sink kafka

接上文&#xff1a;一文说清flink从编码到部署上线 之前写了kafka source&#xff0c;现在补充kafka sink。完善kafka相关操作。 环境说明&#xff1a;MySQL&#xff1a;5.7&#xff1b;flink&#xff1a;1.14.0&#xff1b;hadoop&#xff1a;3.0.0&#xff1b;操作系统&#…

计算材料学和分子动力学(MD)

文章目录 1. 计算材料学1. 什么是计算材料学2. 计算材料学尺度1. 纳观尺度2. 微观尺度3. 介观尺度4. 宏观尺度 2.分子动力学1.什么是分子动力学1. 历史上第一个分子动力学模拟2.第一个连续势场的分子动力学模拟3.第一个Lennard-Jones势分子动力学模拟 2.分子动力学的并行3.常用…

.net core sdk 项目多版本切换

使用global.json文件指定项目要使用的sdk版本&#xff1a; 在项目根目录下执行cmd命令&#xff08;sdk的版本默认为当前使用的最新的sdk的版本&#xff09; 默认sdk&#xff1a;dotnet new globaljson指定sdk&#xff1a;dotnet new globaljson --sdk-version <version>…

【Git】-- 版本说明

Alpha&#xff1a;是内部测试版,一般不向外部发布,会有很多 Bug .一般只有测试人员使用。Beta&#xff1a;也是测试版&#xff0c;这个阶段的版本会一直加入新的功能。在 Alpha 版之后推出。RC&#xff1a;(Release Candidate) 顾名思义么 ! 用在软件上就是候选版本。系统平台…

QT信号槽

目录 概念 函数原型 实现 3.1 自带信号→自带槽 3.2 自带信号→自定义槽 3.3 自定义信号 信号槽传参 对应关系 5.1 一对多 5.2 多对一 信号槽的优势 信号槽的注意事项 概念 信号和槽是Qt框架在C语言基础上扩展的一种机制&#xff0c;用于对象之间的通信。这一机制类…

SSM 架构下 Vue 电脑测评系统:为电脑性能评估赋能

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

如何在电脑上控制手机?

在现代生活中&#xff0c;通过电脑控制手机已经成为一种高效的工作和娱乐方式。Total Control 是一款实用的电脑端软件&#xff0c;通过USB或Wi-Fi连接&#xff0c;用户可以在电脑上直接操作多台手机,通过电脑键盘输入文字&#xff0c;提高操作效率。特别适合需要大屏操作的用户…

MySQL篇之对MySQL进行参数优化,提高MySQL性能

1. MySQL参数优化说明 MySQL 参数调优是提高数据库性能的重要手段之一。通过调整 MySQL 的配置参数&#xff0c;可以优化查询速度、提升并发处理能力、减少资源消耗等。 MySQL 的性能优化涉及到多个方面&#xff0c;包括内存管理、磁盘 I/O、查询优化、连接管理、复制配置等。…