`
- 浏览:
125723 次
-
架构
<wbr><wbr><wbr><wbr><span></span>Android 中的<span style="line-height:21px; word-wrap:normal; word-break:normal">图形</span><span style="line-height:21px; word-wrap:normal; word-break:normal">系统</span>采用 Client/Server 架构。Server (即SurfaceFlinger) 主要由 C++<span></span><span style="line-height:21px; word-wrap:normal; word-break:normal">代码</span>编写而成。Client
端代码分为两部分,一部分是由 Java 提供的供应用<span style="line-height:21px; word-wrap:normal; word-break:normal">程序</span>使用的 API,令一部分则是用 C++ 写成的底层实现。下图概要介绍了 Android 图形系统的架构以及使用的主要组件。<br><img title="Android<wbr>图形系统剖析<wbr>(转)" alt="" src="http://www.linuxgraphics.cn/images/android/android_graphics_system_arch_1.png" width="420" height="300" style="padding-bottom:0px; border-right-width:0px; list-style-type:none; margin:0px; padding-left:0px; padding-right:0px; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px"><br><img title="Android<wbr>图形系统剖析<wbr>(转)" alt="" src="http://www.linuxgraphics.cn/images/android/android_graphics_system_arch_2.png" width="420" height="300" style="padding-bottom:0px; border-right-width:0px; list-style-type:none; margin:0px; padding-left:0px; padding-right:0px; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px"><br>
SurfaceFlinger<br><br>
SurfaceFlinger 在整个图形系统中担任 server 角色,它负责将各个 surface 根据 Z order 合成 (composer) 起来。<br>
Surface<br><br>
Android图形系统中一个重要的概念和线索是surface。View及其子类(如 TextView, Button)要画在surface上。每个surface创建一个Canvas对象 (但属性时常改变),用来管理view在surface上的绘图操作,如画点画线。每个 canvas对象对应一个bitmap,存储画在surface上的内容。<br><br>
每个Surface通常对应两个buffer,一个front buffer, 一个back buffer。其中, back buffer就是canvas绘图时对应的bitmap (研究<span></span><span style="line-height:21px; word-wrap:normal; word-break:normal">android</span>_view_Surface.cpp::lockCanvas)。因此,绘画总是在back buffer上,需要更新时,则将back buffer和front
buffer互换。<br><br>
The window is tied to a Surface and the ViewRoot asks the Surface for a Canvas that is then used by the Views to draw onto. After View draw its data to canvas, ViewRoot will call surface.unlockCanvasAndPost(canvas) to schedule surfaceFlinger::composeSurfaces()
which do the actually display to display panel. SurfaceFlinger handles to transfers drawn data in canvas to surface front buffer or backbuffer.<br><br>
Except for SurfaceViews, different views within the same ViewRoot share the same surface.<br>
Layer<br><br>
每个surface又对应一个layer, SurfaceFlinger负责将各个layer的front buffer合成(composite)<span style="line-height:21px; word-wrap:normal; word-break:normal">绘制</span>到屏幕上。<br><br>
A Layer is something that can be composited by SurfaceFlinger (should have been called LayerFlinger). There are several types of Layers if you look in the code, in particular the regular ones (Layer.cpp) , they are backed by a Surface, and the LayerBuffer (very
badly chosen name) which don't have a backing store, but receive one from their client. . Note that the GGLSurface type, should have been called GGLBuffer.<br><br>
Multiple layers are just composited to the final buffer in their Z order.<br>
创建一个 Surface 的过程<br><br>
Android 创建一个 Surface 的过程如下面的序列图所示:<br><img title="Android<wbr>图形系统剖析<wbr>(转)" alt="" src="http://www.linuxgraphics.cn/images/android/android_create_surface_sequence_diagram.png" width="600" height="249" style="padding-bottom:0px; border-right-width:0px; list-style-type:none; margin:0px; padding-left:0px; padding-right:0px; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px"><br>
研究一个surface如何创建的关键路径如下:<br><br>
1. frameworks/base/core/java/android/view/Surface.java — Surface::Surface ()。<br><br>
2. frameworks/base/core/jni/android_view_Surface.cpp — Surface_init ()。<br><br>
在这个<span style="line-height:21px; word-wrap:normal; word-break:normal">函数</span>中SurfaceComposerClient 对象被创建。<br><br>
3. frameworks/base/libs/ui/SurfaceComposerClient.cpp — SurfaceComposerClient::SurfaceComposerClient ().<br><br>
这个函数非常重要,在这里建立了client和server之间的桥梁。通过函数_get_surface_manager()获得了一个指向 server的IBinder 对象(具有ISurfaceComposer接口),之后通过这个IBinder就可以跨进程访问Server的功能。接着调用 ISurfaceComposer::createConnection()创建并返回了一个ISurfaceFlingerClient的 IBinder。<br><br>
4. frameworks/base/libs/ui/SurfaceComposerClient.cpp — SurfaceComposerClient::createSurface().<br><br>
这个函数中,利用前面获得的ISurfaceFlingerClient的IBinder,调用其createSurface接口。<br><br>
5.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp — BClient::createSurface ()。<br><br>
BClient由ISurfaceFlingerClient派生而来。<br><br><wbr><span></span><wbr><span></span>6.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp — SurfaceFlinger:: createSurface()。<br><br>
这个函数为Surface创建一个对应的Layer。<br><br>
上述关键路径中,1,2,3,4<span style="line-height:21px; word-wrap:normal; word-break:normal">运行</span>于client进程中,而5,6运行与server进程中。server作为一个service提供给client访问。<br>
与图形相关的代码分析<br><br>
与图形相关的代码主要位于下列目录:<br><br>
1. frameworks/base/graphics/java/android/graphics<br><br>
2.frameworks/base/core/java/android/view<br><br>
3.frameworks/base/core/java/android/widget<br><br>
4.frameworks/base/opengl/<br><br>
5.frameworks/base/libs/ui<br><br>
6.frameworks/base/libs/surfaceflinger<br><br>
7.frameworks/base/core/jni/android/graphics<br><br>
8.frameworks/base/core/jni/android/opengl<br><br>
9.frameworks/base/core/jni/android/android_view_*.cpp<br><br>
10.external/skia<br>
android.graphics, android.view和android.widget<br><br>
1.frameworks/base/graphics/java/android/graphics<br><br>
2.frameworks/base/core/java/android/view<br><br>
3.frameworks/base/core/java/android/widget<br><br>
android.graphics, android.view和android.widget功能和其他类似的图形库如 Qt/Gtk+差不多,分别提供基本的图形原语(如画点画线,设置图形上下文等),事件机制,以及<span style="line-height:21px; word-wrap:normal; word-break:normal">开发</span>图形用户<span style="line-height:21px; word-wrap:normal; word-break:normal">界面</span>的<span style="line-height:21px; word-wrap:normal; word-break:normal">控件</span>等。canvas
用于开发2D图形, Surface 代表一个可供图形系统绘制的surface。可在其上绘制2D活3D图形。<br>
frameworks/base/opengl/<br><br>
这个目录包含opengel的接口以及<span style="line-height:21px; word-wrap:normal; word-break:normal">软件</span>实现。在<br><br><a href="http://developer.android.com/guide/topics/graphics/opengl.html" target="_blank" style="color:rgb(54,100,157); text-decoration:none">http://developer.android.com/guide/topics/graphics/opengl.html</a><br><br>
有详细介绍如何使用android.opengl开发3d graphics。<br>
external/skia<br><br>
skia与cairo功能相当,封装底 层的图形<span style="line-height:21px; word-wrap:normal; word-break:normal">硬件</span>,为上面的图形库提供最基础的操作图形硬件的原语。关于 skia 可参考《淺談 Google Skia 圖形處理引擎》2和 《Android 的图形引擎 Skia》3两篇文章。<br>
frameworks/base/libs/ui 和 frameworks/base/libs/surfaceflinger<br><br>
ISurface 定义了基础的Surface接口,供图形系统客户端 (应用)和server端(即surfaceflinger)交互。<br><br>
BpSurface是ISurface的派生类,提供接口供server 调用客户端功能;<br><br>
BnSurface是ISurface的另一个派生类,提供接口供客户端调用server功能。当 server 收到来自客户端 (通过BnSurace)的调用请求后,如registerBuffers, postBuffer等,BnSurface:<img title="Android<wbr>图形系统剖析<wbr>(转)" border="0" alt="" src="http://www.m8sdn.com/images/smilies/default/shocked.gif" style="padding-bottom:0px; border-right-width:0px; list-style-type:none; margin:0px; padding-left:0px; padding-right:0px; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px">nTransact被触发。<br><br>
Surface (LayerBaseClient的私有类)是BnSurface的派生类。<br><br>
SurfaceBuffer (SurfaceBuffer的私有类)是Surface的派生类。<br><br>
ISurfaceComposer 定义了基础的接口,供客户端和server端交互。<br><br>
BpSurfaceComposer是一个派生类,提供接口供server调用客户端功能;<br><br>
BnSurfaceComposer是另一派生类,提供接口供客户端调用server功能。类 SurfaceFlinger 由BnSurfaceComposer派生而来。<br><br>
SurfaceComposerClient直接供客户端使用,调用ISurface (BnSurface)和 ISurfaceComposer (BnSurfaceComposer)以及 ISurfaceFlingerClient 接口,与server交互。<br><br>
BClient 派生自ISurfaceFlingerClient (BnSurfaceFlingerClient),调用server的createSurface,真正创建一个surface。每个surface对应一个layer.<br><br>
egl_native_window_t 定义了一个本地window类 。这个类提供了对本地window 的所有描述以及用于egl (opengl 与本地图形系统的接口)操作本地windwo的所有方法。<br><br>
EGLNativeSurface是egl_native_window_t的一个派生类。<br><br>
EGLDisplaySurface是EGLNativeSurface的派生类。 EGLDisplaySurface 是一个非常重要的类,在这个类里,真正打开framebuffer设备(/dev/graphics/fb0 或者/dev/fb0),并将这个设备封装成EGLDisplaySurface的形式供server使用。函数mapFrameBuffer打开framebuffer, 创建两个缓冲区,(一个是on screen front 缓冲区, 另一个back buffer, 可能位于offscreen framebuffer,也可能位于系统<span style="line-height:21px; word-wrap:normal; word-break:normal">内存</span>)。
函数swapBuffers将back buffer内容拷贝到front buffer中。<br><br>
DisplayHardware 类中初始化了egl系统,并为本地窗口对象EGLDisplaySurface 创建了对应的EGLSurface 对象。surfaceflinger 使用DisplayHardware去和本地窗口打交道。<br>
jni<br><br>
7.frameworks/base/core/jni/android/graphics<br><br>
8.frameworks/base/core/jni/android/opengl<br><br>
9.frameworks/base/core/jni/android/android_view_*.cpp<br><br>
这些目录下的代码在Java层的graphics 组件和native (c++)组件之间衔接,将java层的功能调用转换到对应的本地调用。<br><br>
hardware/libhardware实现了HAL(Hardware Abstraction Layer)层,copybit device是其中一个模块。</wbr></wbr></wbr></wbr></wbr></wbr>
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
Android图形系统分析-surfaceFlinger流程.欢迎研究surface 人员下载学习
Android图形系统的分析与移植,本文对Android 的图形系统底层实现技术进行研究,介绍了Android 图形系统的组成
Android 图形系统的分析与移植~~~~~~~~~~~~~~~
6.28,创想汇的又一期【J+】沙龙活动结束了,参加【J+】的是这样一群人,他们热爱技术,他们乐于分享,他们是支持【J+】一步一步长大的动力,我们这就去认识一下他们——传说中的程序猿
Android图形系统及GPU加速分析
Android_图形系统分析-surfaceFlinger流程
Android 图形系统剖析 Android 立体效果图片 NDK动态库的调用 Android 姿态传感器 Android 很酷的图像旋转 Android 添加音频 在Android中实现多线程断点下载 Android提高篇内容整理 android移动开发案例精选 ...
2.1 Android平台的系统框架 2.2Android平台的特征 2.3Android平台的优势 2.4相关概念与技术 13 2.4.1资源文件与XML 13 2.4.2 SQLite 数据库 14 2.4.3图形用户界面与组件 14 2.4.4 Binder 机制 15 2.5本章小结 16 ...
其次,对基于 Android平台手机图形编辑软件进行了需求分析与 设计,包括系统功能需求分析、系统用例分析及用户界面需求分析。 同时,对系统进行了设计。在设计时,首先对系统进行整体的层次结 构化设计,然后对系统...
随着智能手机的大量普及, Android操作系统市场因此风生水起。...本文在分析Android手机软件的开发原理及相关技术的基础上,开发基于Android平台的校园APP系统,让用户能随时随地的使用传统的WEB服务。
软件开发设计:PHP、QT、...云计算与大数据:数据集、包括云计算平台、大数据分析、人工智能、机器学习等,云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。
Android图形系统 自定义View的使用 动画系统 Resource
第六章介绍Android工具包(toolkit),在第七章向你介绍如何设计和发布你的应用程序,第八章介绍了两个数据存储系统,在第九章中,你可以学会如何定位和使用地图,10~12章介绍了图形编程。第十三章将更加深入地介绍...
Android手机屏幕图形锁问题分析.pdf
第13章全面地剖析了Android的编译系统,包括编译工具、映像文件编译、SDK编译、NDK编译和目标系统的配置等;第14章分析了Android系统的启动过程;第15章讲解了Android的系统管理原理,包含内存管理、应用管理、电源...
短信发送流程图形剖析(含编码)Android平台整理.pdf