news 2026/4/27 20:20:38

AIDL Hal 开发笔记3---- stable-c HAL 实例分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AIDL Hal 开发笔记3---- stable-c HAL 实例分析

目录


stable-c HAL 实例分析

在 HIDL HAL 中 聊过 Same-Process HALs,这类 hal 的调用对性能要求高,一般直接链接,不适用跨进程的方式来调用。

在 AIDL HAL 中,与之对应的是 stable-c HAL。stable-c HAL 就是一个对外接口稳定的 so 库。

接着我们来看一个源码中的 stable-c HAL,hardware/interfaces/graphics/mapper

这里只是给出一个框架,具体需要芯片厂商来做实现。

其中最重要的就是hardware/interfaces/graphics/mapper/stable-c/implutils/include/android/hardware/graphics/mapper/utils/IMapperProvider.h,其中的IMapperV5Impl就是 stable-c HAL 的对外接口:

structIMapperV5Impl{staticconstautoversion=AIMAPPER_VERSION_5;virtual~IMapperV5Impl()=default;virtual AIMapper_ErrorimportBuffer(constnative_handle_t*_Nonnull handle,buffer_handle_t_Nullable*_Nonnull outBufferHandle)=0;virtual AIMapper_ErrorfreeBuffer(buffer_handle_t_Nonnull buffer)=0;virtual AIMapper_ErrorgetTransportSize(buffer_handle_t_Nonnull buffer,uint32_t*_Nonnull outNumFds,uint32_t*_Nonnull outNumInts)=0;virtual AIMapper_Errorlock(buffer_handle_t_Nonnull buffer,uint64_tcpuUsage,ARect accessRegion,intacquireFence,void*_Nullable*_Nonnull outData)=0;virtual AIMapper_Errorunlock(buffer_handle_t_Nonnull buffer,int*_Nonnull releaseFence)=0;virtual AIMapper_ErrorflushLockedBuffer(buffer_handle_t_Nonnull buffer)=0;virtual AIMapper_ErrorrereadLockedBuffer(buffer_handle_t_Nonnull buffer)=0;virtualint32_tgetMetadata(buffer_handle_t_Nonnull buffer,AIMapper_MetadataType metadataType,void*_Nullable destBuffer,size_tdestBufferSize)=0;virtualint32_tgetStandardMetadata(buffer_handle_t_Nonnull buffer,int64_tstandardMetadataType,void*_Nullable destBuffer,size_tdestBufferSize)=0;virtual AIMapper_ErrorsetMetadata(buffer_handle_t_Nonnull buffer,AIMapper_MetadataType metadataType,constvoid*_Nonnull metadata,size_tmetadataSize)=0;virtual AIMapper_ErrorsetStandardMetadata(buffer_handle_t_Nonnull buffer,int64_tstandardMetadataType,constvoid*_Nonnull metadata,size_tmetadataSize)=0;virtual AIMapper_ErrorlistSupportedMetadataTypes(constAIMapper_MetadataTypeDescription*_Nullable*_Nonnull outDescriptionList,size_t*_Nonnull outNumberOfDescriptions)=0;virtual AIMapper_ErrordumpBuffer(buffer_handle_t_Nonnull bufferHandle,AIMapper_DumpBufferCallback _Nonnull dumpBufferCallback,void*_Null_unspecified context)=0;virtual AIMapper_ErrordumpAllBuffers(AIMapper_BeginDumpBufferCallback _Nonnull beginDumpBufferCallback,AIMapper_DumpBufferCallback _Nonnull dumpBufferCallback,void*_Null_unspecified context)=0;virtual AIMapper_ErrorgetReservedRegion(buffer_handle_t_Nonnull buffer,void*_Nullable*_Nonnull outReservedRegion,uint64_t*_Nonnull outReservedSize)=0;};

Google 给出了一个模拟器的实现/external/minigbm/cros_gralloc/mapper_stablec

external/minigbm/cros_gralloc/mapper_stablec/Mapper.cpp中实现了一个 CrosGrallocMapperV5 类继承自 IMapperV5Impl,实现了所有的对外接口。

另外,定义了两个对外的入口符号:

extern"C"uint32_tANDROID_HAL_MAPPER_VERSION=AIMAPPER_VERSION_5;extern"C"AIMapper_ErrorAIMapper_loadIMapper(AIMapper*_Nullable*_Nonnull outImplementation){staticvendor::mapper::IMapperProvider<CrosGrallocMapperV5>provider;returnprovider.load(outImplementation);}

使用 mapper hal 的程序可以通过 AIMapper_loadIMapper 获取AIMapper指针,AIMapper内部的函数最终都会调用到 CrosGrallocMapperV5 类中的具体实现中。

这里两个符号都使用 extern “C” 修饰,也就是, c 和 cpp 程序都可以使用这两个符号来使用 mapper 模块。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 20:31:51

AIDL Hal 开发笔记4----驱动开发

目录一、编写Linux 内核驱动1.1 编写驱动1.2 将模块编译进内核二、Native 程序测试驱动程序三、权限配置驱动开发 一、编写Linux 内核驱动 1.1 编写驱动 Linux 驱动实际就是一个 Linux 内核模块。 首先&#xff0c;我们需要理解什么是内核模块&#xff1f;简单来说&#x…

作者头像 李华
网站建设 2026/4/24 16:34:57

导师推荐!MBA开题报告TOP8 AI论文写作软件测评

导师推荐&#xff01;MBA开题报告TOP8 AI论文写作软件测评 2026年MBA开题报告写作工具测评&#xff1a;精准选择&#xff0c;提升效率 随着AI技术的不断进步&#xff0c;越来越多的MBA学生开始借助智能写作工具来提高论文写作效率。然而&#xff0c;面对市场上琳琅满目的AI论文…

作者头像 李华
网站建设 2026/4/25 3:54:59

CAD协作更高效!浩辰CAD看图王电脑版能看视频批注了

CAD图纸遇到问题&#xff0c;沟通起来不方便&#xff0c;视频批注功能就能完美解决这一问题&#xff0c;哪里有问题拍视频记录下来&#xff0c;批注在相应的位置&#xff0c;既清楚又明白&#xff0c;沟通省时省力。 浩辰CAD看图王&#xff08;手机版&#xff09;目前已新增视…

作者头像 李华
网站建设 2026/4/25 10:05:00

Docker Swarm ES集群基本维护

文章目录 一、运维视角:集群状态与监控(1-5) 例1:查看 ES 集群健康状态(核心运维) 例2:查看集群所有节点信息 例3:查看集群基本信息(版本、名称) 例4:查看集群所有索引列表 例5:查看节点 JVM 内存使用情况 二、开发+运维:索引基础操作(6-9) 例6:创建自定义索引…

作者头像 李华
网站建设 2026/4/23 11:29:18

关于单元测试编写原则的一些思考

目的 单元测试编写的目的&#xff0c;是面向计算机特性的&#xff0c;基于函数的in-out&#xff0c;所以单元测试的好帮手就是断言&#xff0c;通过不断的构造输出并对结果进行断言&#xff0c;我们就可以针对一个对象以及它的函数&#xff0c;构建出充足的用例去包裹它&#…

作者头像 李华
网站建设 2026/4/21 20:40:53

前端项目打包部署完整流程

1. 环境准备确认项目为 Vue.js 前端项目已安装 Node.js (> 14.0.0) 和 npm (> 6.0.0)项目依赖已安装 (node_modules)2. 选择打包环境根据部署环境选择对应的打包命令:测试环境: npm run build:test生产环境: npm run build:prod3. 执行打包# 进入项目目录 cd web-master-…

作者头像 李华