【Android源码 栏目提醒】:网学会员为广大网友收集整理了,Android图形系统的分析与移植 - 操作系统,希望对大家有所帮助!
电信科学 2010 年第 2 期 研究与开发
Android 图形系统的分析与移植 叶炳发,孟小华 (暨南大学计算机系 广州 510632 ) 摘 要 本 文 对
Android 的 图 形 系 统 底 层 实 现 技 术 进 行 研 究 , 介 绍 了
Android 图 形 系 统 的 组 成 。
结 合 Surface Manager 的 工 作 原 理 分 析 了
Android 图 形 显 示 的 实 现 , 在 进 程 通 信 原 理 的 基 础 上 分 析 了 Surface Manager 的实 现 过 程 ,比 较 了 在 Surface 和 OpenGL 中 采 用 的 双 缓 冲 技 术 ,描 述 了 帧 缓 冲 驱 动移植的过程。
关键词
Android ;图 形 系 统 ;surface ;帧 缓 冲1 引言 2
Android 图形显示原理
Android 作为第一个完整、开放、免费的手机平台,自推 2.1 图形系统组成出以来就是业界的热门话题 ,由于拥有良好的可移 植 性 和
Android SDK 的 图 形 包 主 要 包 括
android.graphics 、强大的功能, 在嵌入式设备方面的应用表现出良好的势
android.view 、
android.widget 和
android.opengl , 前 3 个 是 用头。
在图形显示方面 ,
Android 建立在 Linux 上,但并没 有 于 2D 的 图 形 开 发 , 基 于 SGL ( Skia graphics library )。
像一些桌面 Linux 使用 GTK ( GIMP Toolkit )组建 XWindows
android.opengl 是用于 3D 的图形开发,基于 OpenGL/ES 。
(一个多平台的图形用户接口 ), 也没有使用 Cairo 向量图 Skia 是 一 个 开 放 源 码 的 2D 向 量 图 形 处 理 函 数 库 ,形链接库实现图形显示, 而是使用了专为
Android 而改良 包含字型、坐标转换以及点阵图,有着高效能且简洁的的 一 种 2D 向 量 图 形 处 理 函 数 库 Skia 。
在 3D 图 形 方 面 是 表 现 , 在
Android 平 台 中 搭 配 OpenGL/ES 与 特 定 的 硬 件基 于 嵌 入 式 3D 图 形 算 法 标 准 OpenGL/ES 实 现 的 ,该 库 可 特 征 强 化 了 显 示 效 果 。
OpenGL / ES 是 OpenGL 的 一 个以使用 硬 件 加 速 。
然 而 ,虽 然 Google 开 放 了
Android 的 源 子集,是一个跨平台图形库,是专门为嵌入式系统而代 码 ,但 相 关 技 术 文 档 很 少 ,而 且 图 形 系 统 的 实 现 原 理 比 设计的。
较复杂, 所以本文集中对
Android 图形系统的底层原理进
Android 图形系统 的 组 成 如 图 1 所 示 。
上 层 应 用 调 用行研究。
2D 和 3D 图形库对 Surface Manager 提 供 的 Surface 进 行 绘 制 , 通 过 Surface Manager 的 合 成 器 SurfaceFlinger 对 各 个 Surface 进行合成, 并由 EGL 接口实现在 Framebuffer 设备 广东省科技计划项目(No.2007B020715001 ) 上的显示。
65 研究与开发 式进行递交。
2.3 Surface Manager 的实现 从 Surface Manager 工 作 原 理 分 析 , 可 以 理 解 Application 与 Surface Manager 是 以 C/S 的 模 式 进 行 交 互 的 ,Application 处 理 Surface 的 部 分 是 客 户 端 , 而 Surface Manager 提 供 服 务 , 它 们 之 间 通 过
Android 的 IPC 机 制 Binder 来协助完成,如图 3 所示。
2.2 Surface Manager 的工作原理 在
Android 的 图 形 系 统 中 ,Surface Manager 是 一 个 重要组成,Surface Manager 对上层提供 Surface 给应用进行绘制, 管理对显示子系统的访问 , 对来自多个应用的 2D 和3D 图 像 进 行 无 缝 的 合 成 后 传 给 底 层 的 EGL 进 行 处 理 ,Surface Manager 的工作原理如图 2 所示。
在 Binder 中 , 主 要 包 括 两 个 方 面 : 本 地 (native ),如 BnSurfaceFlingerClient , 这 是 一 个 需 要 被 继 承 和 实 现 的 类 ; 代 理 (proxy ),如 BpSurfaceFlingerClient ,这 是 一 个 在 接 口 框 架中被实现 , 但是在接口中没有体现的类 。
在客户端中 , Surface Manager 为 Application 准备一个或多个 Surface BpSurfaceFlingerClient 被 调 用 , 通 过 与 BnSurfaceFlinger-后 , 把 Surface 传 给 Application , 让 Application 可 以 在 上 面 Client 通 信 , 而 BpSurfaceFlingerClient 和 BnSurfaceFlinger-作图形处理。
应用程序先通过调用图形库提供基础的绘制 Client 派生自 ISurfaceFlingerClient,BClient 派生自 BnSurface-图形原语和 JNI 函数,然后又通过 Native Method 的绘制图 FlingerClient 。
形原语调用 2D 和 3D 的图形库对 Surface 进行绘制。
在 客 户 端 中 通 过 类 SurfaceComposerClient , 调 用 在
Android 平 台 下 ,每 个 Surface 都 有 一 个 Front Buffer BnSurfaceComposer 和 BnSurface 来 响 应 服 务 端 BpSurface-和 一 个 Back Buffer , 每 个 窗 口 都 以 一 个 Surface 对 象 作 为 Composer 和 BpSurface , 并 通 过 调 用 BpSurfaceFlingerClient基础。
每个 Surface 又对应一个 Layer ,SurfaceFlinger 将各个 来调用服务端的 BnSurfaceFlingerClient ,由此完成了客户端Layer 的 Front Buffer 合成后绘制到 Frame Buffer 上。
和服务端的交互。
在交互中的 3 个接口分别介绍如下。
关于 SurfaceFlinger , 在 Surface Manager 中用于管理逻 ISurfaceFlingerClient : 派 生 出 BpSurfaceFlingerClient辑上众多的 Surface ,其功能特点如下: 和 BnSurfaceFlingerClient , 由 BClient 实 现 , 通 过 调 用 SurfaceFlinger 在 一 个 系 统 范 围 内 合 成 Surface 的 功 createSurface 函 数 创 建 一 个 Surface 供 Application 应用。
能,并把合成后的显示内容传给帧缓冲设备; ISurface : 派生出 BpSurface 和 BnSurface , 主要完成 对 SurfaceFlinger 能 一 起 合 成 来 自 多 个 程 序 的 2D 或 Surface 的 处 理 ,在 Surface (派 生 自 BnSurface )的 函 数 lock 、 3D 显示的 Surface ; unlockAndPost 等 , 实 现 了 Surface 在 双 缓 冲 的 处 理 , Surface 通过
Android 的 IPC 机制 Binder 以缓冲的形 SurfaceBuffer (派生自 Surface )实现了 Layer 上的处理。
66 电信科学 2010 年第 2 期 IS urfaceComposer : 派 生 出 BpSurfaceComposer 和 把准备显示的图形提交到 Canvas 上;BnSurfaceComposer , SurfaceFlinger ( 派 生 自 BnSurface lockCanvas ,锁定 Canvas ;Composer ) 主 要 为 合 成 器 SurfaceFlinger ( Surface Manager drawCanvas , 把 bitmap 中 的 数 据 写 入 到 Back的 组 成 部 分 ) 对 Surface 合 成 的 相 关 处 理 提 供 实 现 Buffer 中 ;方法。
unlockCanvasAndPost ,解锁 Canvas , Back Buffer 替换 Front Buffer , 替 换 后 Back Buffer 作 为 前 台 缓 冲 ,3
Android 的双缓冲技术 Front Buffer 作为后台缓冲。
在
Android 平台中,双缓冲技术分别在 Surface 的处理 4 底层接口与驱动移植和底层 Framebuffer 的处 理 中 使 用 到 , 在 对 Framebuffer 处理的双缓冲技术根据 OpenGL 的标准实现,而对 Surface 处 4.1
Android 中的 EGL 接口理的双缓冲技术则有所不同 ,下面将对两种双缓冲技术进 OpenGL/ES 为 附 加 功 能 和 可 能 的 平 台 特 性 开 发 了 扩行比较。
展机制,但仍然需要一个可以让 OpenGL/ES 和本地视窗系3.1 OpenGL 中的双缓冲技术 统交互且平台无关的层。
EGL 是 OpenGL/ES 和底层 Native 在 OpenGL 中 利 用 双 缓 冲 技 术 , 分 配 两 个 帧 缓 冲 区 , 平台视窗系统之间的接口,是为 OpenGL/ES 提供平台独立在连续显示三维曲面时 ,一个帧缓冲区中的数据执行绘制 性而设计。
OpenGL/ES 本质上是一个图形渲染管线的状态曲面命令的同时, 另一个帧缓冲区中的数据进行图形显 机 ,而 EGL 则 是 用 于 监 控 这 些 状 态 以 及 维 护 Frame Buffer示。
当前可见视频缓冲称为前台视频缓冲,不可见的、正在 和其他渲染 Surface 的外部层。
绘图的视频缓冲称为后台视频缓冲。
当后台视频帧缓冲中 在
Android 的底层源代码中,egl_native_window_t 是一个的 数 据 要 求 显 示 时 , OpenGL 就 将 它 拷 贝 到 前 台 视 频 帧 缓 提供了对本地窗口的所有定义以及用于 EGL 操作本地窗口的所冲 ,显 示 硬 件 不 断 地 读 可 见 视 频 缓 冲 中 的 内 容 ,并 把 结 果 有方法的类。
EGLNativeSurface 派生自 egl_native_window_t,显示在屏幕上。
应用双缓冲 ,每一帧三维曲面只在绘制完 EGLDisplaySurface 派 生 自 EGLNativeSurface 。
EGLDisplay-成后才显示出来,所以观察者可以看到每一帧完整三维曲 Surface 通 过 函 数 mapFrameBuffer 打 开 Framebuffer 设 备 ,面,而不是曲面的绘制过程。
并创建两 个 缓 冲 区 ,函 数 swapBuffer 把 后 台 视 频 缓 冲 区 复3.2 Surface 中的双缓冲技术 制 到 前 台 视 频 缓 冲 区 。
DisplayHardware 类 中 初 始 化 了 每个 Surface 中都带有两个帧缓冲区, 分别称为 Front EGL , SurfaceFlinger 使 用 了 DisplayHardware 去 和 本 地 窗 口Buffer 和 Back Buffer , 与 OpenGL 中双缓冲技术有所不同, 打交道。
当绘制 Back Buffer 后需要显示时,并没有将 Back Buffer 中 4.2
Android 帧缓冲驱动的移植的数据拷贝到 Front Buffer 中,而是直接显示 Back Buffer 中
Android 是基于 Linux 的,但在 Linux 的帧缓冲驱动中并的数据到屏幕中,从而最大限度地减少了数据的复制。
没有直接支持双缓冲,修改驱动包括两个方面:一是划分两 图 4 是 使 用 Canvas 绘 制 Surface 的 原 理 , 具 体 过 程 个缓冲区; 二是添加缓冲区的切换功能。
本文是在 PXA270如下: 上进行研究的,对应的驱动文件是/drivers/video/pxafb.c。
创建一个 bitmap 与 Canvas 关联起来; 在
Android 中 , double buffer 设 计 成 上 下 两 个 buffer 的 模 式 , 在 函 数 pxafb_setmode “ var-yres_virtual var- yres ” 修 改 为 “ var-yres_virtual var-yres 2 ”, 在 检 查 参 数的函数 pxafb_check_var 中“ var-yres_virtualmaxvar- yres_virtual var -yres ” 修 改 为 “ var -yres_virtual max var-yres_virtual var-yres 2 ”。
相对应的缓冲长度也要 修 改 为 默 认 的 两 边 ,即 在 函 数 pxafb_decode_mode_info 中 添加“ smemlen 2 ”。
当 一 个 缓 冲 区 已 写 好 , 在 切 换 时 就 需 要 调 用 到 pan 67 研究与开发函 数 ,该 函 数 将 一 个 新 的 yoffset 传 给 LCD 控 制 器 。
在 结 bits_per_pixel/8构 体 fb_ops pxafb_ops 中 添 加 pan 函 数 , 即 插 入 “ . breakfb_pan_display pxafb_pan_display ” 到 fb_ops pxafb_ops …中 。
在 初 始 化 帧 缓 冲 的 函 数 pxafb_init_fbinfo 中 ,将 “ fbi- fb.fix.ypanstep 0 ;” 修 改 为 “ fbi -fb.fix.ypanstep 1 ;”, 这 5 结束语里 是 说 明 驱 动 需 要 用 到 pan 函 数 。
以 下 是 需 要 添 加 或 修改的函数。
对
Android 的应用开发来说, 图形开发是其中一个主static int pxafb_pan_display struct fb_var_screeninfo var 要 工 作 , 了 解
Android 图 形 系 统 的 工 作 原 理 可 以 对 应 用struct fb_info info 程 序 性 能 上 的 提 供 有 所 帮 助 。
在
Android 移 植 到 其 他 嵌 struct pxafb_info fbi struct pxafb_info info // 下 一 入 式 设 备 中 ,
Android 图 形 系 统 的 底 层 驱 动 移 植 是 其 中 一个显示的 fb 的 yoffset 个关键部分,通过对底层图形接口以及对帧缓冲驱动移 fbi-fb.var.yoffset var-yoffset // 将 fb 的 信 息 和 控 植 的 研 究 , 将 更 有 效 地 实 现
Android 在 其 他 嵌 入 式 设 备制状态插入 fb 的工作队列 上的移植。
pxafb_schedule_workfbiC_CHANGE_DMA_BASE return 0 参考文献 1 宋 宝 华 .Linux 设 备 驱 动 开 发 详 解 . 北 京 : 人 民 邮 电 出 版 社 2008static void set_ctrlr_statestruct pxafb_info fbi u_int state 2 姚 昱 旻 刘 卫 国 .
Android 的 架 构 与 应 用 开 发 研 究 . 计 算 机 系 统 … 应 用 2008 (11 ) 3 Patrick Brady. Anatomy Physiology of an
Android. http://sites. case C_CHANGE_DMA_BASE: // 将 fb 传 给 LCD 的 google.com/site/io/anatomy--physiology-of-an-androidDMA 4 David Blythe Affie Munshi. OpenGL ES 1.0.02 Specification. fbi-dma_buff-dma_descDMA_UPPER.fsadr fbi- http://www.khronos.org/registry/gles/specs/1.0/opengles_spec_1_0.screen_dma fbi-fb.var.xresfbi-fb.var.yoffsetfbi-fb.var. pdf Analysis and Transplantation of
Android Graphic System Ye Bingfa Meng Xiaohua ( Department of Computer Science Jinan University Guangzhou 510632China )Abstract Researches on the underlying implement technology of
Android graphic system and introduces the composition ofAndroid graphic system. Analyses the implement of
Android graphics display with the work principle of surface manager andthe analysis of surface manager implementing is based on the process communication. Compares double buffer technologies usingin surface and openGL and describes the implementation of frame buffer driver.Key words
Android graphic system surface framebuffer 收 稿 日 期 :2009-12-12 68