B2HGraphicBufferProducer和H2BGraphicBufferProducer
在 Android 的图形系统中,B2HGraphicBufferProducer
和 BnGraphicBufferProducer
是基于 Binder 机制的两个重要组件,它们负责图形缓冲区的生产接口。二者关系可以理解为 桥接和实现分离,以下是详细说明:
1. B2HGraphicBufferProducer
B2HGraphicBufferProducer
是一个中间桥接类,它的主要功能是将 HAL(硬件抽象层)的 IGraphicBufferProducer
实现桥接为 IGraphicBufferProducer
Binder 接口,使其能通过 Binder IPC 机制进行通信。
-
典型位置: 位于
hardware/interfaces/graphics/allocator
或相关 HAL 接口中,提供跨进程桥接能力。 -
主要用途:
- 将图形缓冲区生产逻辑从底层(硬件驱动/HAL)桥接到 Android 的图形栈。
- 通常配合其他硬件接口,比如
HGraphicBufferProducer
,用于整合 HAL 层资源。
-
关键特性:
B2HGraphicBufferProducer
作用类似于适配器,将传统 HAL 中的缓冲区生产逻辑转换为面向高层的 Binder 调用。
2. BnGraphicBufferProducer
BnGraphicBufferProducer
是 IGraphicBufferProducer
的具体 Binder 服务端实现,用于在服务端处理来自客户端的 Binder 调用。
-
主要用途:
- 实现 Binder IPC 的服务端逻辑。
- 处理
IGraphicBufferProducer
接口定义的所有方法,比如缓冲区分配、回收、提交。
-
实现方式:
BnGraphicBufferProducer
通常通过继承接口并覆写其方法,直接对请求进行处理。例如:class BnGraphicBufferProducer : public BnInterface<IGraphicBufferProducer> { public: // Override the methods declared in IGraphicBufferProducer status_t allocateBuffer(...); status_t detachBuffer(...); };
3. 它们之间的关系
-
桥接角色:B2HGraphicBufferProducer
B2HGraphicBufferProducer
不直接实现IGraphicBufferProducer
的逻辑,而是将这些接口转换为 Binder 层接口调用。这使得 HAL 层可以通过 IPC 与高层组件通信。 -
服务端实现:BnGraphicBufferProducer
BnGraphicBufferProducer
提供了IGraphicBufferProducer
接口在服务端的具体实现,处理 Binder 层的调用请求。 -
实际通信流:
- 客户端:通过
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 层 producer
mProducer->requestBuffer(slot, ...);
}
private:
sp<IGraphicBufferProducer> mProducer; // 持有 HAL 实现
};
// BnGraphicBufferProducer 示例:作为服务端处理 Binder 调用
class BnGraphicBufferProducer : public BnInterface<IGraphicBufferProducer> {
status_t allocateBuffer(...) override {
// 实现缓冲区分配逻辑
}
status_t detachBuffer(...) override {
// 实现缓冲区分离逻辑
}
};
5. 关键区别
特性 | B2HGraphicBufferProducer | BnGraphicBufferProducer |
---|---|---|
角色 | 桥接 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()
为例:
- 客户端进程调用
BpGraphicBufferProducer::queueBuffer()
。 - Binder 将调用请求发送到服务端的
BnGraphicBufferProducer
。 - 在服务端,
BnGraphicBufferProducer
负责处理:- 如果是 HAL 请求,转发到
B2HGraphicBufferProducer
,再桥接到 HAL 实现。 - 如果是 Framework 内部逻辑,由
SurfaceFlinger
或其他服务直接处理。
- 如果是 HAL 请求,转发到
具体调用路径可能类似:
客户端:
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. 两者的分工
特性 | H2BGraphicBufferProducer | B2HGraphicBufferProducer |
---|---|---|
方向 | HAL 层向 Framework 层提供接口桥接 | Framework 层向 HAL 层请求执行桥接 |
接口类型 | 提供 IGraphicBufferProducer 实现,供 Binder 使用 | 使用 HAL 提供的 HGraphicBufferProducer 实现,将调用委托给 HAL 层实现 |
运行位置 | 服务端,通常在 Binder 服务端处理逻辑 的高层接口 | 服务端,也负责与 HAL 紧密交互 |
作用 | 让 HAL 层的具体实现作为 Binder 服务暴露给客户端 | 调用 HAL 层的具体实现,并将结果传递回 Framework 层 |
4. 如何理解调用流
在 Android 图形栈的某些情况下,这种双向桥接实现(H2B 和 B2H)是为了让服务端既能够作为一个 Binder 服务暴露给客户端,又能直接与硬件(HAL)通信,统一管理图形缓冲区的生产、分发和使用。
以 queueBuffer
为例:
-
客户端调用
- 客户端(如应用或 Framework)通过
BpGraphicBufferProducer
发起queueBuffer
调用。 - Binder 将调用请求转发到服务端。
- 客户端(如应用或 Framework)通过
-
H2BGraphicBufferProducer
- 服务端的
H2BGraphicBufferProducer
(如果存在)会接收客户端调用,并包装 HAL 提供的实现接口。
- 服务端的
-
BnGraphicBufferProducer
BnGraphicBufferProducer
作为 Binder 服务端核心入口,接收并解析客户端调用。
-
B2HGraphicBufferProducer
- 在 Binder 处理完服务端业务后,调用 HAL 层逻辑,通过
B2HGraphicBufferProducer
将queueBuffer
调用转发到HGraphicBufferProducer
。
- 在 Binder 处理完服务端业务后,调用 HAL 层逻辑,通过
-
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) 客户端到服务端:
- 客户端调用
BpGraphicBufferProducer::queueBuffer
。 - 服务端
BnGraphicBufferProducer::onTransact
接收调用并分发到:- 桥接类
H2BGraphicBufferProducer
中。 - 或服务端直接处理。
- 桥接类
(b) 服务端调用 HAL:
- 服务端逻辑中,调用
B2HGraphicBufferProducer::queueBuffer
。 - 最终,调用 HAL 的
HGraphicBufferProducer
。
7. 总结
H2BGraphicBufferProducer
是一个 HAL 转 Binder 的桥接器,用于服务端。B2HGraphicBufferProducer
是一个 Binder 转 HAL 的桥接器,用于连接 Binder 层与 HAL 层。- 调用路径依赖场景设计,主要方向是:
- 客户端调用到 Framework 或 HAL:
BpGraphicBufferProducer -> H2BGraphicBufferProducer
。 - Framework 调用 HAL 实现:
B2HGraphicBufferProducer -> HGraphicBufferProducer
- 客户端调用到 Framework 或 HAL:
实际情况:
在Android 14的代码里,这两个类似乎没怎么在surfaceflinger或者说graphics模块上有太多用处,反而是在Camera和Video模块里有new过这两个类。
另外,H2BGraphicBufferProducer
类的父类定义在:system/libhidl目录下,可自行查找。