安卓原生开发-Recovery使用minui绘制图形
源码分析
源码:
https://cs.android.com/android/platform/superproject/main/+/main:bootable/recovery/minui/Android.bp
代码结构:

- include 头文件,暴露接口给外部使用。
- events用于处理事件
- graphics 是图形层抽象
- graphics_drm是图像层的实现:DRM方式
- graphics_fbdev是图像层的实现:framebuffer方式
- resources是资源处理部分
底层图形渲染接口
多种后端接口类型,用枚举 GraphicsBackend 表示
图像层需要实现的 MinuiBackend 后端渲染接口:

-
初始化 Init()
- fbdev方式下是 open节点
/dev/graphics/fb0 - drm方式是open节点
/dev/dri/数字编号0~64
- fbdev方式下是 open节点
-
返回下一帧渲染 Flip()
- fb方式的非常简单,乒乓的交替FBIOPUT_VSCREENINFO;非乒乓的直接memcpy

-
Blank() 的两个版本接口,默认和指定屏幕
- FB的实现相对简单,就是驱动的ioctl

-
多屏判断 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)
--------蓝天上的云_转载请注明出处.

浙公网安备 33010602011771号