【Android GUI】从总体上了解Android的GUI体系

news2025/2/28 15:44:06

文章目录

  • 概览
    • Android硬件接口HAL
    • Gralloc与Framebuffer
  • Gralloc模块的加载
  • Gralloc提供的接口
  • Android原生的Gralloc实现
    • 打开framebuffer设备
    • 打开gralloc设备
  • 参考

概览

在这里插入图片描述

  • Linux内核提供了统一的framebuffer显示驱动。设备节点/dev/graphics/fb*或者/dev/fb*,其中fb0表示第一个Monitor。

  • Android的HAL层提供了Gralloc,包括fb和gralloc两个设备。fb负责打开内核的framebuffer、初始化配置。gralloc管理帧缓冲区的分配和释放。所以上层只需要通过Gralloc来间接访问帧缓冲区,来保证对framebuffer的统一管理。

  • HAL层的composer为UI合成提供接口,被surface flinger调用。

  • VSync是“Project Butter”加入的同步机制,可以通过硬件产生,也可以通过软件,即VSyncThread模拟。

  • OpenGL ES 是一个通用函数库,需要和具体平台建立关联才可以工作。

  • FramebufferNativeWindow负责OpenGL ES在Android平台本地化的中介之一

  • EGL为OpenGL ES配置本地窗口。

Android硬件接口HAL

HAL是Android很多子系统,例如显示系统、音频系统等和Linux kernel驱动之间通信的统一接口。

Gralloc与Framebuffer

Framebuffer是内核系统提供的图形硬件的抽象描述,它占用了系统存储空间的一部分,是一块包含屏幕显示信息的缓冲区。
Android中,Framebuffer提供的设备文件节点是/dev/graphics/fb*

Android的显示系统借助于HAL层的Gralloc操作帧缓冲区。

Gralloc模块的加载

Gralloc对应的模块是由FramebufferNativeWindow在构造函数中加载的。

hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
#define GRALLOC_HARDWARE_MODULE_ID "gralloc"

hw_get_module查找和ID值匹配的库:

#define HAL_LIBRARY_PATH1 "/system/lib/hw"
#define HAL_LIBRARY_PATH2 "/vendor/lib/hw"

lib库的命名形式:

gralloc.[ro.hardware].so
gralloc.[ro.product.board].so
gralloc.[ro.board.platform].so
gralloc.[ro.arch].so

默认的:

    gralloc.default.so

Gralloc提供的接口

/*hardware/libhardware/include/hardware/Hardware.h*/
typedef struct hw_module_t {struct hw_module_methods_t* methods;//一个HAL库必须提供的方法} hw_module_t;

typedef struct hw_module_methods_t {
    int (*open)(const struct hw_module_t* module, const char* id,
           struct hw_device_t** device);
} hw_module_methods_t;

前面提供的架构图中,open接口可以帮助上层打开“fb0”和“gpu0”。fb0就是主屏幕,gpu0负责图形缓冲区的分配和释放。

/*frameworks/native/libs/ui/FramebufferNativeWindow.cpp*/
FramebufferNativeWindow::FramebufferNativeWindow()
: BASE(), fbDev(0), grDev(0), mUpdateOnDemand(false)
{…
    err = framebuffer_open(module, &fbDev); //打开fb设备
    err = gralloc_open(module, &grDev);//打开gralloc设备

Android原生的Gralloc实现

Android原生态的Gralloc实现在hardware/libhardware/modules/gralloc中,它open接口对应的是:

/*hardware/libhardware/modules/gralloc/Gralloc.cpp*/
int gralloc_device_open(const hw_module_t* module, const char* name, hw_device_t** device)
{
    int status = -EINVAL;
    if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) {//打开gralloc设备} else {
        status = fb_device_open(module, name, device);//否则就是fb设备
    }
    return status;
}

打开framebuffer设备

/*hardware/libhardware/modules/gralloc/Framebuffer.cpp*/
int fb_device_open(hw_module_t const* module, const char* name, hw_device_t** device)
{
    int status = -EINVAL;
    if (!strcmp(name, GRALLOC_HARDWARE_FB0)) {//设备名是否正确
       fb_context_t *dev = (fb_context_t*)malloc(sizeof(*dev));/分配hw_device_t空间,   
       这是一个“壳”*/
       memset(dev, 0, sizeof(*dev));//初始化,良好的编程习惯
       …
       dev->device.common.close = fb_close;//这几个接口是fb设备的核心
       dev->device.setSwapInterval = fb_setSwapInterval;
       dev->device.post = fb_post;
       …
       private_module_t* m = (private_module_t*)module;
       status = mapFrameBuffer(m);//内存映射,以及参数配置
       if (status >= 0) {*device = &dev->device.common;//“壳”和“核心”的关系
       }
    }
    return status;
}

标准的fb设备需要实现:int (*post)(struct framebuffer_device_t* dev, buffer_handle_t buffer);,将buffer数据post到屏幕上 ,这样buffer内容在下一次VSYNC中被显示出来。
设置缓冲区swap的时间间隔:int (*setSwapInterval)(struct framebuffer_device_t* window, int interval);
设置刷新区域:int (*setUpdateRect)(struct framebuffer_device_t* window, int left, int top, int width, int height);

接着是打开kernel层的fb设备和对fb进行配置,在mapFrameBuffer()中完成,它会尝试打开:

"/dev/graphics/fb%u"或者 "/dev/fb%u"

打开后,通过

ioctl(fd, FBIOGET_FSCREENINFO, &finfo);
ioctl(fd, FBIOGET_VSCREENINFO, &info)

得到屏幕参数,接着通过ioctl(fd, FBIOPUT_VSCREENINFO, &info)对fb进行配置。

mapFrameBuffer()的另外一个任务是做为fb设备做内存映射:

    void* vaddr = mmap(0, fbSize, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);    
    module->framebuffer->base = intptr_t(vaddr);
    memset(vaddr, 0, fbSize);

打开gralloc设备

/*hardware/libhardware/modules/gralloc/Gralloc.cpp*/
int gralloc_device_open(const hw_module_t* module, const char* name, hw_device_t** device)
{
    int status = -EINVAL;
    if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) {
        gralloc_context_t *dev;//做法和fb类似
        dev = (gralloc_context_t*)malloc(sizeof(*dev));//分配空间
        /* initialize our state here */
        memset(dev, 0, sizeof(*dev));
        …
        dev->device.alloc = gralloc_alloc; //从提供的接口来看,gralloc主要负责“分配和释放”操作
        dev->device.free = gralloc_free;}

总结下Android原生的Gralloc:
在这里插入图片描述

参考

《深入理解Android内核设计思想》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1601442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入浅出LLM大语言模型

一. 前言 2022年末,聊天程序ChatGPT的上线,在短短5天被注册用户就破百万。ChatGPT的爆火,在一夜之间,带领人类穿越到了真正的人工智能时代。 本文会从ChatGPT作为切入点,在介绍其底层的GPT模型诞生史后,再…

DAY14|二叉树理论基础、递归遍历、迭代遍历、统一迭代

理论基础、递归遍历、迭代遍历、统一迭代 理论基础递归遍历迭代遍历前序中序后序 统一迭代 理论基础 今天的内容极其基础也极其重要,今天的不掌握好,之后一个半月都要坐大牢… 以前算法课上学的还行,可能还能记得一些(希望&#…

机器人视觉软件实现目标检测通常借助深度学习技术和计算机视觉算法

机器人视觉软件实现目标检测通常借助深度学习技术和计算机视觉算法。以下是一般而言的目标检测实现步骤: 1、数据收集与标注:首先需要收集包含目标物体的大量图像数据,并对这些图像进行标注,标注出目标物体的位置和类别信息。这些…

深度强化学习(DRL)算法 附录 6 —— NLP 回顾之预训练模型篇

Self-Attention 模型结构 上图架构以 batch_size 为 1,两个时间步的 X 为例子,计算过程如下: 位置编码 根据 self-attention 的模型结构,改变 X 的输入顺序,不影响 attention 的结果,所以还需要引入额外的…

读《AI营销画布》步骤三 扩场景(八)

前言 扩场景写起来有点吃力和干巴,为了文章的连续性,还是写点。 扩场景实际上是需要考虑在第一步和第二步之后是否增加业务流程、节点和场景。在确定增加场景之前,我们需要确保的是第一二步的成功,而且模式是可以复制的。所以&…

【数据分析面试】22.补充缺失数据(Python:数据插值interpolate()用法)

题目 数据集来自一个气候研究组织,列表里带有不同城市每日温度读数的时间序列数据。该数据框有三列:date、city 和 temperature。 由于数据记录问题,某些日期的温度读数可能丢失。该组织需要每天的温度读数,因此他们要求你用线性…

2024中国内燃机展-北京汽车发动机零部件展

2024第二十三届中国国际内燃机与零部件展览会 由中国内燃机工业协会主办、中国机床专用技术设备有限公司、汽车工艺装备成套开发集团协办的2024中国国际内燃机及动力装备博览会(简称“动博会”)将于2024年10月11日-13日在亦创国际会展中心隆重举办。本届…

linux@内核@内核版本发展@镜像文件查看内核

文章目录 linux内核介绍简介小结 linux发行版和内核各个linux发行版和内核的关系内核更新追踪GAHWE版的内核 内核版本查看😊linux当前系统内核查看未安装时查看网络搜索内核版本号挂载镜像查看虚拟机启动镜像体验版查看内核版本 linux(内核)版本演进😊相…

Android 自定义SwitchPreference

1. 为SwitchPreference 添加背景&#xff1a;custom_preference_background.xml <?xml version"1.0" encoding"utf-8"?> <selector xmlns:android"http://schemas.android.com/apk/res/android"><item><shape android:s…

计算机网络——实现smtp和pop3邮件客户端

实验目的 运用各种编程语言实现基于 smtp 协议的 Email 客户端软件。 实验内容 1. 选择合适的编程语言编程实现基于 smtp 协议的 Email 客户端软件。 2. 安装 Email 服务器或选择已有的 Email 服务器&#xff0c;验证自己的 Email 客户端软件是否能进行正常的 Email 收发功…

BoostCompass( 查找功能实现 )

阅读导航 一、查找功能基本思路二、详细代码三、代码介绍四、运行结果 一、查找功能基本思路 通过实现一个基于倒排索引的搜索引擎&#xff0c;来提供高效、准确的搜索服务。其核心在于快速准确地从大量文档中检索出与用户查询关键词相关的文档&#xff0c;并按照相关性对结果…

小程序视频怎么保存到mp4

小程序上的视频如何下载成mp4&#xff0c;本文就将教大家如何将小程序视频保存到mp4&#xff0c;这里要用到一个工具:下载高手 下载高手的文件我已经打包好了 下载高手链接&#xff1a;https://pan.baidu.com/s/1qJ81sNBzzzU0w6DWf-9Nxw?pwdl09r 提取码&#xff1a;l09r -…

项目7-音乐播放器3(删除模块+播放音乐模块设计)

1.播放音乐模块设计 1.1 请求响应设计 请求&#xff1a; { get, /music/get?pathxxx.mp3 } 响应&#xff1a; { 音乐数据本身的字节信息 } 1.2 后端代码 1. Files.readAllBytes(String path) : 读取文件中的所有字节&#xff0c;读入内存 &#xff…

实体识别方法

文章目录 实体识别方法求观测序列的概率 实体识别方法 从文本中识别实体边界及其类型 实体识别的常用方法&#xff1a;基于模板和规则。将文本与规则进行匹配来识别出命名实体“说”、“老师”;“大学”、“医院”。优点&#xff1a;准确&#xff0c;有些实体识别只能依靠规则…

APEX开发过程中需要注意的小细节5.5

oracle保留小数点后两位的函数 在日常开发中经常用到百分比做数据对比&#xff0c;但是有可能得到的数据是一个多位小数&#xff0c;结果如下所示&#xff1a; 如果想截取部分小数如保留小数点后两位可以怎么做呢&#xff1f; 在Oracle中&#xff0c;可以使用ROUND函数来四舍…

Nature Climate Change | CO2施肥效应导致1981-2020年的全球陆地植被光合作用增加

在全球范围内&#xff0c;光合作用是大气和生物圈之间最大的单一CO2通量。因此&#xff0c;光合作用的长期变化&#xff0c;例如对大气CO2上升的响应&#xff0c;可能为气候变化提供重要的反馈。理论预测&#xff0c;CO2的增加增加了全球光合作用&#xff0c;这一过程被称为CO2…

根据 Figma 设计稿自动生成 Python GUI | 开源日报 No.221

ParthJadhav/Tkinter-Designer Stars: 8.0k License: BSD-3-Clause Tkinter-Designer 是一个用于快速创建 Python GUI 的工具&#xff0c;通过使用 Figma 设计软件&#xff0c;可以轻松地生成美观的 Tkinter GUI。 主要功能和优势包括&#xff1a; 拖放界面设计比手写代码更快…

SCI一区 | Matlab实现POA-TCN-BiGRU-Attention鹈鹕算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测

SCI一区 | Matlab实现POA-TCN-BiGRU-Attention鹈鹕算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现POA-TCN-BiGRU-Attention鹈鹕算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考…

Spring Boot 处理过滤器(filter )中抛出的异常

前言&#xff1a; 在改造老项目登录功能的时候&#xff0c;使用了过滤器对 token 进行有效性验证&#xff0c;验证通过继续进行业务请求&#xff0c;验证不通过则抛出校验异常。 过程&#xff1a; 技术方案拟定后&#xff0c;就着手开始改造&#xff0c;一切都很顺畅&#x…

OpenStack云平台实战

1、环境准备 主机CPU数量内存硬盘IPV4发行版controller48GB100GBens33: 192.168.110.27/24 esn34: 192.168.237.131/24CentOS 7.9compute48GB200GB、100GBens33: 192.168.110.26/24 esn34: 192.168.237.132/24CentOS 7.9 1.1 虚拟机安装部署 1.1.1 创建虚拟机 这里16或者17都…