安卓原生开发-Recovery使用minui绘制图形

源码分析

源码:
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语言经常有那种古老魔法师程序员在里面写咒语吟唱的感觉,命名千奇百怪。

绘制元素

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

事件机制

总所周知,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)
posted @ 2025-11-28 21:29  蓝天上的云℡  阅读(9)  评论(0)    收藏  举报