惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
V
V2EX
博客园 - 【当耐特】
WordPress大学
WordPress大学
爱范儿
爱范儿
美团技术团队
宝玉的分享
宝玉的分享
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
小众软件
小众软件
量子位
Hugging Face - Blog
Hugging Face - Blog
B
Blog RSS Feed
Recorded Future
Recorded Future
Engineering at Meta
Engineering at Meta
雷峰网
雷峰网
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
M
MIT News - Artificial intelligence
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 聂微东
H
Hackread – Cybersecurity News, Data Breaches, AI and More
腾讯CDC
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
博客园 - 叶小钗
GbyAI
GbyAI
Y
Y Combinator Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
F
Full Disclosure
G
Google Developers Blog
D
Docker
T
Tailwind CSS Blog
C
Check Point Blog
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
T
The Blog of Author Tim Ferriss
B
Blog
博客园 - 三生石上(FineUI控件)
博客园 - Franky
H
Help Net Security
MyScale Blog
MyScale Blog
U
Unit 42
D
DataBreaches.Net
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
InfoQ
阮一峰的网络日志
阮一峰的网络日志
The GitHub Blog
The GitHub Blog
L
LangChain Blog
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog

博客园 - 蓝天上的云℡

事件编程之eventfd 事件驱动编程模式之EventLoop syslog日志查看器GUI图形界面,支持Windows/Linux/Macos开箱即用 ERRNO链条分析 ARM AMBA总线之AXI系 Linux Kernel Init Bootstrap 内核初始化启动 RK芯片平台GPIO控制 Linux USB子系统之Gadget设备端驱动 远程调试桥接-网络-ADB-GDB 斐讯N1盒子安装飞牛FNOS NAS 安卓以太网链路检测 蓝牙音频协议——安卓开发 RKxx系列的RK628摄像头配置影响HDMI出图 usb储存之BOT/UAS内核驱动 现代操作系统-音频处理技术1 Linux驱动底层 Linux驱动适配I2C/SPI例子 模块编译的pr_debug Linux内核/GKI内核主线更新-usb网卡名称变更引出的BUG 为Kernel代码生成VSCODE索引,快速跳转 安卓开机时间/性能优化 Linux/Golang/glibC系统调用 SGDMA与普通DMA Linux内核源码-存储驱动之 QSPI Flash golang数据转换技巧
安卓原生开发-Recovery使用minui绘制图形
蓝天上的云℡ · 2025-11-28 · via 博客园 - 蓝天上的云℡

源码分析

源码:
https://cs.android.com/android/platform/superproject/main/+/main:bootable/recovery/minui/Android.bp

代码结构:
image

  • include 头文件,暴露接口给外部使用。
  • events用于处理事件
  • graphics 是图形层抽象
    • graphics_drm是图像层的实现:DRM方式
    • graphics_fbdev是图像层的实现:framebuffer方式
  • resources是资源处理部分

底层图形渲染接口

多种后端接口类型,用枚举 GraphicsBackend 表示
图像层需要实现的 MinuiBackend 后端渲染接口:
image

  • 初始化 Init()

    • fbdev方式下是 open节点 /dev/graphics/fb0
    • drm方式是open节点 /dev/dri/数字编号0~64
  • 返回下一帧渲染 Flip()

    • fb方式的非常简单,乒乓的交替FBIOPUT_VSCREENINFO;非乒乓的直接memcpy
    • image
  • Blank() 的两个版本接口,默认和指定屏幕

    • FB的实现相对简单,就是驱动的ioctl
    • image
  • 多屏判断 HasMultipleConnectors()

    • Linux中叫做crtc
  • 对象资源销毁~MinuiBackend()

    • 退出接口

DRM的实现会更好点,DRM整体框架面向对象,但也看起来在内核c风格里面格格不入,像极了c里面混进去一个cpp一样。
吐槽:内核c语言经常有那种古老魔法师程序员在里面写咒语吟唱的感觉,命名千奇百怪。

附图,DRM在Linux图形架构DRI中的位置,这里recovery的minui相当于libGl
image
image

image
图源:https://en.wikipedia.org/wiki/Direct_Rendering_Infrastructure

绘制元素

这里将字体、图片、图形等等统称为绘制元素。

事件机制

总所周知,xx一定要xx,所以图形界面一定要有事件。
events.cpp里面有以下:

  • 添加输入设备 bool should_add_input_device(int fd, bool allow_touch_inputs)
  • 绑定文件描述符的事件回调int inotify_cb(int fd, __unused uint32_t epevents)
  • 事件初始化int ev_init(ev_callback input_cb, bool allow_touch_inputs)
  • 获取事件描述符 int ev_get_epollfd(void)
  • 添加事件回调 int ev_add_fd(android::base::unique_fd&& fd, ev_callback cb)
  • 退出事件 void ev_exit(void)
  • 事件等待 int ev_wait(int timeout)
  • 事件分发 void ev_dispatch(void)
  • 获取事件输入 int ev_get_input(int fd, uint32_t epevents, input_event* ev)
  • sw开关型_事件状态同步 int ev_sync_sw_state(const ev_set_sw_callback& set_sw_cb)
  • key按键型_事件状态同步 int ev_sync_key_state(const ev_set_key_callback& set_key_cb)
  • 执行按键事件回调器 void ev_iterate_available_keys(const std::function<void(int)>& f)
  • 执行触摸事件回调器 void ev_iterate_touch_inputs(const std::function<void(int)>& action)