Android12 Gralloc

Android显示系统-GraphicBuffer和Gralloc分析 BufferQueue中的Buffer对象,我们用的都是GraphicBuffer,那么GraphicBuffer是怎么来的呢?接下里我们具体来看这里的流程。 Surface是Andorid窗口的描述,是ANativeWindow的实现;同样GraphicBuffer是Android中图形Buffer的描述,是ANativeWindowBuffer的实现。而一个窗口,可以有几个Buffer。... 阅读详情
AI摘要

文章详细介绍了在Ubuntu20.04的AOSP环境中,如何在X86PC上通过Minigbm实现支持图形(byvirtio-gpu)的Android虚拟机。Gralloc提供了IAllocator和IMapper接口,涉及多种实现如mali、msm、nxp等,其中详细解析了Minigbm的框架、线程模型以及在2D和3D模式下的内存操作流程,涉及到的关键接口包括DRM_IOCTL_MODE_CREATE_DUMB、DRM_IOCTL_VIRTGPU_RESOURCE_CREATE等。

软件环境:ubuntu20.04 aosp
硬件环境:X86 PC
模拟环境:在host ubuntu20.04启动支持图形(by virtio-gpu)的Android虚拟机

1. 概述

在这里插入图片描述

2. Android12 Gralloc

2.1 接口说明

  • gralloc主要提供IAllocator和IMapper两类接口
#gralloc HAL接口定义:IAllocator
/hardware/interfaces/graphics/allocator/4.0/IAllocator.hal
#mapper HAL接口定义:IMapper
/hardware/interfaces/graphics/mapper/4.0/IMapper.hal 

2.2 实现说明

  • gralloc有多种实现,如mali,msm,nxp,goldfish,minigbm等
 #ID和版本
GRALLOC_HARDWARE_MODULE_ID
GRALLOC_MODULE_API_VERSION_1_0 //msm nxp
GRALLOC_MODULE_API_VERSION_0_3 //minigbm-gralloc0 hikey960
GRALLOC_MODULE_API_VERSION_0_2 //goldfish-gralloc30 hikey960
#头文件和实现
hardware/libhardware/include/hardware
libhardware/modules/gralloc/gralloc.cpp
  • 二进制
#厂商实现库位于vendor/lib64/hw
libminigbm_gralloc.so
#cuttlefish中allocator组成
libhidlbase.so #线程和IPC相关
android.hardware.graphics.allocator@4.0.so #BnHwAllocator实现
android.hardware.graphics.allocator@4.0-service.minigbm # main和CrosGralloc4Allocator实现
libminigbm_gralloc.so #cros_gralloc和virtgpu_virgl实现
libdrm.so #依赖 

2.3 gralloc-minigbm框架

在这里插入图片描述

#1. BnHwAllocator::onTransact binder接收消息,调用Gralloc4实现,另有Gralloc0实现
#2. CrosGralloc4Allocator框架,实现了init/initializeMetadata/allocate操作,通过cros_gralloc_driver实例调用其接口
#3. cros_gralloc_driver框架,实现了allocate/flush/lock等操作,直接调用drv框架
#4. Drv框架,实现了bo的一些操作,被cros_gralloc_driver和gbm调用,依赖于各厂商Gralloc后端实现,如drv_bo_create
#5. 各个厂商backend实现. 向drv框架注册驱动回调,如virtgpu_virgl 
const struct backend virtgpu_virgl = { .name = "virtgpu_virgl",
                       .init = virgl_init,
                       .close = virgl_close,
                       .bo_create = virgl_bo_create,
                       .bo_destroy = virgl_bo_destroy,
                       .bo_import = drv_prime_bo_import,
                       .bo_map = virgl_bo_map,
                       .bo_unmap = drv_bo_munmap,
                       .bo_invalidate = virgl_bo_invalidate,
                       .bo_flush = virgl_bo_flush,
                       .resolve_format_and_use_flags =
                       virgl_resolve_format_and_use_flags,
                       .resource_info = virgl_resource_info,
                       .get_max_texture_2d_size = virgl_get_max_texture_2d_size };
                       

2.4 线程

  • allocator进程通常一个主线程,多个个binder线程,实际执行操作如bo create都在binder线程中进程
thread #1: name = 'allocator@4.0-s'
thread #2: name = 'HwBinder:412_1'
thread #3: name = 'HwBinder:412_2'
thread #4: name = 'HwBinder:412_3'

2.5 cuttlefish allocator

服务:android.hardware.graphics.allocator@4.0-service.minigbm
实现:/vendor/lib/libminigbm_gralloc.so 
源码:external/minigbm/
操作:需要图形界面有更新才有allocator内部操作

2.6 allocator跟踪

  • 由于没有画面更新时allocator没有响应,在副屏启动web Activity看allocator都有哪些操作
am start -n com.android.webview/org.chromium.android_webview.devui.MainActivity --display 2 
2.6.1 cuttlefish 2D模式
  • 2D模式下,画面更新,基本是不断创建和销毁DUMB操作。内存操作最终依赖libdrm提供的接口
DRM_IOCTL_MODE_CREATE_DUMB -> drmPrimeHandleToFD -> DRM_IOCTL_MODE_DESTROY_DUMB ...
创建GraphicBuffer对象
IPCThreadState::getAndExecuteCommand
BnHwAllocator::onTransact #allocator@4.0.so
CrosGralloc4Allocator::allocate #allocator@4.0-service.minigbm
    cros_gralloc_driver::allocate  #libminigbm_gralloc.so
      drv_bo_create(width=777, height=471) 
        virgl_bo_create(width=400, height=600) 
          drv_dumb_bo_create_ex(..width=448, height=640) 
            #创建了一块内存放在了gem cma的对象里
            DRM_IOCTL_MODE_CREATE_DUMB
     drv_bo_get_plane_fd
       drmPrimeHandleToFD
销毁GraphicBuffer对象,与3D时接口不同
CrosGralloc4Allocator::allocate
  cros_gralloc_driver::release
    cros_gralloc_buffer::~cros_gralloc_buffer
      virgl_bo_destroy
        drv_dumb_bo_destroy
          DRM_IOCTL_MODE_DESTROY_DUMB
2.6.2 cuttlefish 3D模式
  • 3D模式下,画面更新,基本是不断创建和销毁VIRTGPU_RESOURCE操作。内存操作最终依赖libdrm提供的接口
 DRM_IOCTL_VIRTGPU_RESOURCE_CREATE -> drmPrimeHandleToFD -> DRM_IOCTL_GEM_CLOSE ...
创建一个GraphicBuffer对象
BnHwAllocator::_hidl_allocate #allocator@4.0.so
  CrosGralloc4Allocator::allocate #allocator@4.0-service.minigbm
    cros_gralloc_driver::allocate #libminigbm_gralloc.so
      virgl_bo_create 
        virgl_3d_bo_create(bo=0xe8141090, width=400, height=600, format=875708993, use_flags=2597)
          DRM_IOCTL_VIRTGPU_RESOURCE_CREATE 
      drv_bo_get_plane_fd
        drmPrimeHandleToFD
销毁GraphicBuffer对象
CrosGralloc4Allocator::allocate
  cros_gralloc_driver::release
    cros_gralloc_buffer::~cros_gralloc_buffer
      virgl_bo_destroy
        drv_gem_bo_destroy
          DRM_IOCTL_GEM_CLOSE

2.7 其他实现

gralloc每个厂商实现不同,上文只分析了再Android模拟环境中minigbm实现,还有别的实现。
#ARM Mali GPU Gralloc
https://developer.arm.com/downloads/-/mali-drivers/android-gralloc-module
#源码目录driver\product\android\gralloc\src\4.x实现IAllocator 和 IMapper

#rk3588基于mali bifrost
https://github.com/rockchip-toybrick/rk_hardware_libgralloc_bifrost

3. 参考

https://www.cnblogs.com/roger-yu/category/2009688.html

Android图形系统之SurfaceFlinger/OpenGL/HWC/Gralloc/FrameBufer/ION/GPU等关系(十三) 本篇目的:理解SurfaceFlinger/OpenGL/HWC/Gralloc/FrameBufer/ION关系。 阅读详情

相关推荐

Android图形渲染框架

Android图形渲染框架包括:Gralloc分配缓冲区,BufferQueue作为缓冲队列连接生产者与消费者,可以使用TextureView、SurfaceView和GlSurfaceView

徐福记456 2万+

Android研究_Gralloc_4alloc设备open过程分析

alloc设备open过程分析 在开启fb设备的过程中,会调用函数gralloc_open(module, &gralloc_device);去开启alloc设备。该函数定义在:/hardware/libhardware/include/hardware/gralloc.h /** convenience API for opening and closing a suppor

putiancaijunyu的专栏 1138

Android系统属性如何控制虚拟机图形渲染

Android系统属性(System Property)是一种基于共享内存的轻量级进程间键值通信机制,不同于Java系统属性或环境变量,它在init阶段即生效,深度参与HAL模块加载、EGL后端选择与SurfaceFlinger初始化。其核心原理是通过`__system_property_get()`在native层读取,驱动`libEGL.so`等关键库动态绑定渲染后端(如SwiftShader、VirGL),从而决定OpenGL ES版本支持、GPU直通路径及软件回退策略。该机制在安卓虚拟机场景中尤为关

weixin_34098209的博客 41

Android图形显示之硬件抽象层Gralloc

FrameBuffer驱动程序分析文中介绍了Linux系统下的显示驱动框架,每个显示屏被抽象为一个帧缓冲区,注册到FrameBuffer模块中,并在/dev/graphics目录下创建对应的fbX设备。Android系统在硬件抽象层中提供了一个Gralloc模块,封装了对帧缓冲区的所有访问操作。用户空间的应用程序在使用帧缓冲区之间,首先要加载Gralloc模块,并且获得一个gralloc设备和一个...

架构设计 954

iTOP4412|Android-4.0.3_r1 无法显示开机动画

根据开发板说明编译出来的内核,无法进入开机动画界面,本文介绍具体分析过程和最终解决方法。

OneSea 768

MT8788 Android 12 HDMI 黑屏修复:DRM/KMS驱动与HWC2适配全解析

HDMI 是嵌入式 Android 系统中关键的显示输出接口,其稳定工作依赖 DRM/KMS 显示子系统、HAL 层 Gralloc 缓冲区管理及 HWC2 合成服务的协同。在 Android 12 中,因内核电源管理增强、Gralloc4 ABI 变更与 HWC2 初始化依赖链收紧,联发科 MT8788 平台易出现 EDID 读取失败、framebuffer 提交崩溃、HWC2 死锁等典型黑屏问题。本文围绕 HDMI 驱动适配核心——DRM connector 状态检测机制与 HWC2 初始化流程,详解如

weixin_29164185的博客 211

Android帧缓冲区硬件抽象层模块Gralloc的实现原理(精华总结 )

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33895516的博客 194

PHP版本对接支付宝支付接口 电脑网站 详细介绍 沙箱环境 超简单易懂

PHP版本对接支付宝支付接口 其实理顺了思路后,按照我接下来的步骤来,真的超级简单啊,为啥有那么多的朋友们折腾了那么久呢,嘿嘿,跟我走吧~ 我是昨天晚上洗完澡之后,大概八九点,才开始正式开工尝试去这一工程的,我去支付宝的蚂蚁金服开放平台里把各个知识点和文档大概都看了一遍,大致弄明白了要怎么操作了,建议大家看看电脑网站开发文档,忙到了夜里十二点左右,成功地用支付宝给的Demo完成了付款操...

爱玲姐姐的博客 1万+

安卓应用Linux桌面花屏排查:GBM与Gralloc格式对齐实战

在Linux上运行安卓应用时,图形缓冲区管理(Gralloc)与通用缓冲区管理(GBM)的格式对齐是常见技术挑战。像素格式不匹配、步长对齐差异及缓冲区生命周期管理不当,均可能导致画面异常。理解安卓图形栈与Linux DRM的交互原理,有助于提升跨平台图形渲染的稳定性。该技术广泛应用于云手机、安卓容器化及桌面模拟环境,通过格式归一化与日志追踪可有效解决花屏问题。

weixin_31856057的博客 244

Ecg信号QRS波峰检测:A Real-Time QRS Detection Algorithm (Pan-Tompkins法)

Pan-Tompkins法是R峰检测的经典方法,被引量高达6000+次。 Pan J, Tompkins W J. A real-time QRS detection algorithm[J]. IEEE transactions on biomedical engineering, 1985 (3): 230-236. 本文对论文流程进行了总结,并参考BioSigKit项目,复现了论文代码。 流程图: 代码如下: 第一部分是信号读入,这里使用MIT_BIH信号的100,读入10000个数据点 第二部分

weixin_42870380的博客 1万+

【上海大学计算机组成原理实验报告】五、机器语言程序实验

机器语言程序实验//理解计算机执行程序的实际过程//学习编制机器语言简单程序的方法//将R1中的数值左移n次送OUT,其中n是R2中的数值。(指令码从10开始)//完成R3=R0×R1,结果送OUT。(指令码从30开始)//建立“中文汇编指令”需要哪些条件?//上海大学计算机组成原理实验报告

HackerKevon的博客 2188

Android 12冻屏问题实战:从SurfaceFlinger日志到Layer堆栈分析的完整指南

本文深入解析Android 12冻屏问题,提供从SurfaceFlinger日志采集到Layer堆栈分析的完整诊断方法。通过实战案例和工具使用指南,帮助开发者快速定位图形显示系统异常,解决画面冻结、触控失灵等问题,提升系统稳定性。

weixin_30955617的博客 231

用UltraISO制作镜像以RAW格式刻录系统到U盘后,在Windows上无法识别的解决办法

在这篇文章中,用UltraISO制作镜像后,会使得U盘无法识别!!!那么,如何抹掉U盘的数据,格式化U盘呢?

拥抱具身智能,昇腾Ascend C 2730

Android 12开机动画深度定制:AOSP源码级实战指南

开机动画是Android系统启动流程中首个可感知的视觉组件,其本质并非静态资源替换,而是与init、SurfaceFlinger、BootAnimation Service及gralloc HAL深度耦合的系统级服务。在Android 12中,因引入独立BootAnimation Service、强制gralloc4 HAL(要求RGBA_8888格式)、严格SELinux上下文(u:r:bootanim:s0)及desc.txt语法增强等机制,传统‘替换bootanimation.zip’方式极易导致黑屏

weixin_32496547的博客 179

NX/UG二次开发—CAM—设置程序修剪边界Boundary

最近做了一个设置CAM程序边界的小工具,分享一下经验(官方的代码在文章末尾处),以下均以修剪边界曲线为例。 以下为官方提供的源码: /***************************** Include Files **********************************/ #include <stdlib.h> #include <uf.h> #include <uf_obj.h> #include <uf_object_type

门前大桥下,游过一群鸭,快来看一看,原来是C++ 3733

关于动态存储器dram中rank,bank,device之间的关系

DEVICE_WIDTH表示设备的带宽(单位bit),每个列(column)包含DEVICE_WIDTH 位(bit),每一行(row)包含NUM_COLS个column。   而每一个bank包含NUM_ROWS个行(row)。所以一个设备(device)的存储容量为PER_DEVICE_STORAGE =NUM_ROWS*NUM_COLS*DEVICE_WIDTH*NUM_BANKS (i

wyj7260的专栏 4732

安卓应用在Linux桌面花屏原因与修复:GBM与Gralloc缓冲格式对齐实战

在跨平台图形开发中,图形缓冲区管理与视频帧格式转换是核心基础。安卓的Gralloc与Linux的GBM分别管理图形内存,当两者对接时,像素格式枚举、stride步幅及modifier内存布局的错配会导致画面花屏、撕裂或颜色异常。理解YUV与RGB的解读差异、显存对齐规则,能有效提升兼容层与容器化方案的显示稳定性。本文围绕安卓、Linux、视频格式、GBM、Gralloc等关键概念,深入剖析花屏根因,并给出格式映射、stride传递与modifier协商的工程实践,帮助开发者打通解码到显示的完整链路。

weixin_29165465的博客 151

TC3XX - MCAL知识点(四十二):AURIX™ TC3xx实现多相电机需要多核配合使用的场景与实操分析

本文探讨了多相电机控制系统中的关键技术问题,重点分析了多核处理器在电机控制中的应用。针对十二相电机等复杂应用场景,提出了同步采样、多核协同等解决方案。文章详细阐述了相电流同步采样原理及EBTresos配置方法,分析了ADC硬件触发机制和多核配合策略。通过Core0和Core1的协同工作设计,解决了位置信息采集与FOC算法执行的时序问题,并提供了代码实现示例。实验验证了采用ATOM0_7同时触发两个核ADC中断的可行性,为多相电机控制系统的实现提供了技术参考。

梦想技术家 498

Linux下安卓视频花屏的根源与修复:DMA-BUF与YUV格式兼容性解析

视频解码是现代操作系统图形栈的核心能力,其底层依赖于内存缓冲区(buffer)在硬件组件间的高效、无损传递。DMA-BUF作为Linux内核提供的零拷贝共享内存机制,被广泛用于GPU、VPU与显示控制器之间的帧数据交换;而YUV格式(如NV12、P010)则是安卓及移动端视频编解码的标准色彩空间表达。当二者在跨生态场景(如Waydroid、Anbox、RTSP转发)中交汇时,因安卓Gralloc与Linux DRM对DMA-BUF多平面布局、chroma offset对齐、format modifier语义

weixin_33910191的博客 224

热力学仿真软件:SimScale_(1).SimScale入门与基础操作

导航栏:位于页面顶部,包含项目管理、仿真设置、结果分析等主要功能。项目列表:展示用户创建的所有项目。工作区:用于进行具体的操作,如几何建模、网格划分、边界条件设置等。控制台:显示操作日志和仿真进度。网格划分是将几何模型离散化为一系列小单元的过程,这些单元用于求解热力学方程。SimScale提供了多种网格划分方法,包括结构化网格和非结构化网格。SimScale提供了丰富的API接口,用户可以通过编程语言进行二次开发,实现自动化仿真和结果分析。项目管理:创建、删除和管理项目。几何建模:创建、导入和修复几何模型。

kkchenjj的博客 1867

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【Android虚拟摄像头】八、安卓15虚拟摄像头实战:从源码编译到直播画质提升

本文详细介绍了在安卓15系统上实现虚拟摄像头的实战经验,包括开发环境搭建、Camera HAL层权限破解、图像处理优化及直播画质提升技巧。通过LineageOS 22.2源码编译和内核级修改,成功解决SELinux和FUSE限制,显著提升直播画质和帧率稳定性。适用于Android开发者和虚拟摄像头技术爱好者。

weixin_29224309的博客 286

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

SurfaceFlinger启动-Android12

SurfaceFlinger启动-Android12

许浑的博客 3045

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Linux下运行安卓应用花屏?视频格式兼容与渲染管线修复指南

在图形渲染与视频输出的技术栈中,像素格式、内存布局与缓冲区的正确协商,是保证画面稳定输出的基础。当用户在Linux桌面环境中通过容器或兼容层运行安卓应用时,跨系统的帧缓冲传递会涉及RGBA/BGR字节序、Stride对齐以及Buffer Modifier等底层参数。一旦两端对视频格式的约定不一致,便会出现马赛克、偏色、撕裂等花屏现象。理解SurfaceFlinger到DRM/KMS的完整链路,能帮助开发者快速定位是像素格式不匹配、YUV误判还是显存布局异常。本文以Waydroid环境为例,系统梳理排查流程与

weixin_34174422的博客 509

破解安卓应用在Linux下的“花屏魔咒”:一场视频格式的兼容之战!

Mesa在Linux及Android生态中广泛用于图形渲染,但其GBM缓存框架原生不支持视频编解码所需的YUV格式,仅通过GR88模拟YUV12导致字节对齐错误与花屏问题。针对抖音视频场景,分析发现缓存宽度需256字节对齐,并修复了lock_ycbcr中stride未正确返回的问题(原为16字节对齐),解决了花屏故障。该修改已在OpenFDE仓库提交,但兼容性待验证,欢迎反馈。

OpenFDE的博客 160

安卓视频在Linux花屏根源与DMA-BUF格式修复方案

视频渲染本质是跨栈数据管道的语义对齐问题:从YUV色彩空间、平面布局(如NV12)到DMA-BUF内存描述符,任一环节的格式契约断裂都会引发花屏、色偏或黑屏。Linux桌面生态依赖DRM/KMS与VA-API协同输出,而安卓MediaCodec通过gralloc分配buffer并透传HAL_PIXEL_FORMAT语义,二者在pitch对齐、modifier协商、时间戳映射等关键维度长期失配。技术价值在于绕过ABI锁定,在用户态构建轻量级格式翻译层——通过LD_PRELOAD劫持gralloc、动态修正DM

weixin_29169899的博客 146

RK3588+Android12双通道MIPI-DSI DSC显示调试实战

DSC(Display Stream Compression)是现代嵌入式显示系统中实现高分辨率、低带宽传输的关键编解码技术,其原理基于块级熵编码与视觉感知优化,在保证图像质量前提下将RGB/YUV数据压缩至原体积的1/3~1/12。该技术的价值不仅在于节省MIPI-DSI物理链路带宽,更在于支撑双通道同步、降低PHY功耗及提升系统时序确定性。典型应用场景包括车载中控、工业HMI和高端平板等对稳定性与实时性要求严苛的领域。然而在RK3588平台搭载Android 12系统时,DSC功能的启用并非简单开关配置

weixin_29195615的博客 207
上一篇: virtio-console
下一篇: Android drm-hwcomposer
stray2b
博客等级 码龄16年 3852粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值