10_Android的GUI系统.pdf

上传人:qwe****56 文档编号:71061439 上传时间:2023-01-31 格式:PDF 页数:47 大小:446.18KB
返回 下载 相关 举报
10_Android的GUI系统.pdf_第1页
第1页 / 共47页
10_Android的GUI系统.pdf_第2页
第2页 / 共47页
点击查看更多>>
资源描述

《10_Android的GUI系统.pdf》由会员分享,可在线阅读,更多相关《10_Android的GUI系统.pdf(47页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、 Android 的 GUI 系统 韩 超 Android 技术 Android 的 GUI 系统 第一部分 Android GUI 系统综述 第二部分 GUI 框架 libui 库及相关 第三部分 Surface 系统 第四部分 2D 图形系统 第五部分 3D 图形系统 第六部分 窗口和视图结构 第一部分 Android GUI 系统综述l i bpi xel fl i nger SurfaceFl i nger l i buiSurfaceOverlayCameraEglWindowsformat Key/EventSkia图形引擎OpenGL3D引擎androi d.graphi cs.

2、Canvasandroi d.vi ew.SurfaceGraphic JNISurface JNIandroi d.vi ew.Vi ewGLSurfaceView javax.microedition.khronos.opengles各种GUI元素OpenGL JNIcom.google.android.gles_jniFrameBuffer驱动C框架层JAVA框架Event输入驱动 第一部分 Android GUI 系统综述 Android 的 GUI 系统由 C 语言的框架和JAVA 语言的框架组成。GUI 系统的 C 语言部分包括:PixelFlinger libui(框架库)Sur

3、faceFlinger(Surface 的管理)Skia 图形图像引擎 OpenGL 3D 引擎 各种 JNI(向 JAVA 提供接口)第一部分 Android GUI 系统综述GUI 系统 JAVA 语言的核心包括:android.graphics(对应 Skia 底层库)android.view.Surface(构建显示介面)android.view.View 及其继承者 (用于构建 UI 元素)OpenGL 的功能类 javax.microedition.khronos.opengles (由 com.google.android.gles_jni 实现)第二部分 GUI 框架 libu

4、i 库及相关2.1 pixelflinger2.2 libui 2.1 pixelflinger libpixelflingner.so 是一个下层的工具性的类,这个类对外的主要内容是 GGLContext 结构,以及初始化和卸载的函数。system/core/include/pixelflinger/system/core/libpixelflinger/ssize_t gglInit(GGLContext*context);ssize_t gglUninit(GGLContext*context);libpixelflingner.so 这个库对其他的库没有依赖,也并不提供实际的功能,类似

5、一个用于管理工具的库。2.2 libui libui 是一个框架性质的集成库,它不仅是显示的中枢,也是整个 GUI 系统的中枢。UI lib(libui libpixelflinger),这个的相关内容在以下的路径中:frameworks/base/include/ui/frameworks/base/libs/ui/libui 包含了颜色格式,用于实际显示的 Egl 窗口,按键及事件处理,Suface 界面,Overlay,Camera 等几个方面的接口。2.2 libuiformat 部分:这个部分本身定义颜色空间的枚举和数据结构,它需要充用 pixelflinger 中的一些关于数据格式

6、定义。EglWindows 部分:包含了 EGL 头文件构建的 egl_native_window_t,是整个系统显示的基础。Key/Event 部分:这是 Android 系统输入的基础,其中定义按键的映射,通过操作 event 事件设备来实现获取系统的输入的。2.2 libuiSurface:Surface 相关的头文件和实现为 SurfaceFlinger定义接口和框架。头文件:include/surface/Overlay:定义视频输出的接口。Camera:定义摄像头的框架和接口。头文件:include/camera/第三部分 Surface 系统3.1 Surface 系统的结构3.

7、2 SurfaceFlinger 本地代码3.3 Surface 的 Java 和 Jni 代码 3.1 Surface 系统结构Surface 系统的结构:libui.so(或 libsurfacefilnger_client.so)提供Surface 部分的本地接口。libsurfacefilnger.so 提供实现。Java 框架主要调用 Surface 向 UI 提供接口。Navtive 部分主要使用 ISurface。3.1 Surface 系统的结构+registerBuffers()+postBuffer()+unregisterBuffers()ISurfaceBnSurfac

8、e+ID()+setLayer()+setPosition()+setSize()+setAlpha()+getIdentity()+dirtyRegion()+setDirtyRegion()-mClient-mSurfaceSurface+createSurface()+destroySurface()ISurfaceFlingerClientBnSurfaceFlingerClient+createConnection()+freezeDisplay()+unfreezeDisplay()+setOrientation()+bootFinished()+requestGPU()+revo

9、keGPU()ISurfaceComposerBnSurfaceComposer+createSurface()-ISurfaceFlingerClientSurfaceComposerClientSurface 系统的接口 3.1 Surface系统的结构Surface 系统的头文件(路径:frameworks/base/include/ui/或include/surfaceflinger/):ISurface.hISurfaceComposer.hISurfaceFlingerClient.hSurface.hSurfaceComposerClient.h 3.1 Surface系统的结构

10、Surface 系统的源代码文件(路径:frameworks/base/libs/surfaceflinger_client/)ISurfaceComposer.cpp LayerState.cpp SurfaceComposerClient.cppISurfaceComposerClient.cpp ISurface.cpp SharedBufferStack.cpp Surface.cpp 3.1 Surface系统的结构Surfaceflinger 的实现者(路径:frameworks/base/services/surfaceflinger/)SurfaceFlinger 类继承了 I

11、SurfaceComposer,是一个核心的实现。Layer,LayerBuffer,LayerDim 和LayerBlur 是不同层的实现。3.1 Surface系统的结构class SurfaceControl:public RefBasepublic:/.省略部分内容 uint32_t getFlags()const return mFlags;uint32_t getIdentity()const return mIdentity;void clear();status_t setLayer(int32_t layer);status_t setPosition(int32_t x,i

12、nt32_t y);status_t setSize(uint32_t w,uint32_t h);status_t hide();status_t show(int32_t layer=-1);status_t freeze();status_t unfreeze();status_t setFlags(uint32_t flags,uint32_t mask);status_t setTransparentRegionHint(const Region&transparent);status_t setAlpha(float alpha=1.0f);sp getSurface()const

13、;/.省略部分内容 Surface.h 中的 SurfaceControl 类:3.1 Surface系统的结构class ISurface:public IInterface class BufferHeap ;virtual status_t registerBuffers(const BufferHeap&buffers)=0;virtual void postBuffer(ssize_t offset)=0;/one-way virtual void unregisterBuffers()=0;virtual sp createOverlay(uint32_t w,uint32_t h

14、,int32_t format,int32_t orientation)=0;ISurface.h 中的 ISurface 类,这个类主要被本地的代码所调用。3.1 Surface系统的结构+createSurface()+destroySurface()-mId-mFlingerBClient+createConnection()+freezeDisplay()+unfreezeDisplay()+setOrientation()+bootFinished()+requestGPU()+revokeGPU()SurfaceFlinger+setPosition()+setLayer()+se

15、tSize()+setAlpha()+getTypeID()+getTypeInfo()LayerBase+getSurface()-client-clientIndex-getIdentityLayerBaseClient+getSurfaceData()+registerBuffers()+postBuffer()+unregisterBuffers()LayerBaseClient:SurfaceLayerBuffer+getSurfaceData()+registerBuffers()+postBuffer()+unregisterBuffers()LayerBuffer:Surfac

16、eBufferLayerBlur+getLayerUser()+getLayers()+getSurfaceHeapManager()Client+registerBuffers()+postBuffer()+unregisterBuffers()ISurfaceBnSurface+ID()+setLayer()+setPosition()+setSize()+setAlpha()+getIdentity()+dirtyRegion()+setDirtyRegion()-mClient-mSurfaceSurface+createSurface()+destroySurface()ISurfa

17、ceFlingerClientBnSurfaceFlingerClient+createConnection()+freezeDisplay()+unfreezeDisplay()+setOrientation()+bootFinished()+requestGPU()+revokeGPU()ISurfaceComposerBnSurfaceComposer+createSurface()-ISurfaceFlingerClientSurfaceComposerClientLayerDimLayer接口层SurfaceFlinger实现层 3.1 Surface系统的结构class ISurf

18、aceComposer:public IInterfacepublic:enum /(keep in sync with Surface.java)eHidden =0 x00000004,eGPU =0 x00000008,eHardware =0 x00000010,eDestroyBackbuffer =0 x00000020,eSecure =0 x00000080,eNonPremultiplied =0 x00000100,ePushBuffers =0 x00000200,eFXSurfaceNormal =0 x00000000,eFXSurfaceBlur =0 x00010

19、000,eFXSurfaceDim =0 x00020000,eFXSurfaceMask =0 x000F0000,;enum ePositionChanged =0 x00000001,/*.*/;enum eLayerHidden =0 x01,/*.*/;enum eOrientationDefault =0,/*.*/;3.2 SurfaceFlinger 本地代码各个类型的 Surface 层之间的关系:class LayerBaseClient:public LayerBase class Surface:public BnSurface class Layer:public L

20、ayerBaseClientclass LayerBuffer:public LayerBaseClient class SurfaceBuffer:public LayerBaseClient:Surfaceclass LayerDim:public LayerBaseClientclass LayerBlur:public LayerBaseClient 3.2 SurfaceFlinger 本地代码Create a Surface:SurfaceComposerClient:createSurface(ISurface Suface,frameworks/base/libs/ui/Sur

21、faceComposerClient.cpp)(IsurfaceFlingerClient:createSurface)Bclient:createSurface (framework/base/libs/surfaceflinger/SurfaceFlinger.cpp)SurfaceFlinger:createSurface (framework/base/libs/surfaceflinger/SurfaceFlinger.cpp)LayerBaseClient*layer=0;sp surfaceHandle;eFXSurfaceNormal Layer or LayerBuffer

22、eFXSurfaceBlur LayerBlur eFXSurfaceDim LayerDimsurfaceHandle=layer-getSurface();setSize:Surface:setSize()SurfaceComposerClient:setSize()3.3 Surface 的 Java 和 Jni 代码SurfaceSurfaceComposerClientandroid/view/Surfaceandroid/view/SurfaceSession+setLayer()+setPosition()+setPosition()android.view.Surfaceand

23、roid.view.SurfaceSession+getHolder()-mSurface-mSurfaceHolderandroid.view.SurfaceView+getSurface()+lockCanvas()+setFixedSize()+setFormat()+setKeepScreenOn()+setSizeFromLayout()+setType()+unlockCanvasAndPost()android.view.SurfaceHolderandroid.view.SurfaceView:SurfaceHolderandroid.view.viewlibui.soJNIJ

24、AVA FrameworkJAVAApplicationz 3.3 Surface 的 Java 和 Jni 代码#include#include const char*const kSurfaceSessionClassPathName =android/view/SurfaceSession;const char*const kSurfaceClassPathName =android/view/Surface;static void nativeClassInit(JNIEnv*env,jclass clazz);JNI 的代码路径:frameworks/base/core/jni/an

25、droid_view_Surface.cpp 3.3 Surface 的 Java 和 Jni 代码Java 代码的路径:frameworks/base/core/java/android/view/3 个主要的类:Surface (Surface.java)SurfaceView(SurfaceView.java)SurfaceSession(SurfaceSession.java)1 个接口:SurfaceHolder(SurfaceSession.java)android.view.Surface 表示了一个可以绘制图形的界面,它是实际调用底层的 Suface 接口来完成来控制的硬件载体

26、。3.3 Surface 的 Java 和 Jni 代码关于 android.view 包中的 View 类:View 类呈现了最基本的 UI 构造块。一个视图占据 屏幕上的一个方形区域,并且负责绘制和时间处理。View 是 widgets 的基类,常用来创建交互式的用户图形界面(GUI)。View 中包含了一个 Surface,并处理onDraw(Canvas)事件。第四部分 2D 图形系统4.1 Skia 底层库4.2 Android 图形系统的 JNI 接口4.3 Android 的图形类 第四部分 Skia 及 android 的图形系统skia-opengl glue library

27、(libskiagl.so)SGL(Skia Graphic lib)(libskia.so)libjpglibgiflibpnglibft2Codec PluginSkiaCodecSkia Android PortingAndroid basic libSkia APIandroi d.vi ew.SurfaceCanvasandroi d.graphi cs.*C框架层Java框架Graphics JNIandroi d.vi ew.Vi ew 4.1 Skia 底层库 Skia 是 Google 一个底层的图形,图像,动画,SVG,文本等多方面的图形库,它是Android 中图形系统的

28、引擎。Skia 代码的路径:external/skia/Skia 主要的库:Skia 图形库(libskia.so)skia-opengl glue library(libskiagl.so)4.1 Skia 底层库Skia 主要包含三个库的代码路径:核心图形部分src/core/Skia 功能部分src/effects/src/images/src/ports/src/core/src/utils/skia-opengl glue librarysrc/gl/4.2 Android 图形系统的 JNI 接口 Android 的图形系统和 Skia 底层库的联系比 较紧密。Android 的图

29、形系统的 JNI 提供了从Skia 底层库到 JAVA 上层的支持。Android 的图形系统的 JNI 代码的路径:frameworks/base/core/jni/android/graphics/Android 的图形系统对 JAVA 层提供了绘制基本图形的功能,是 GUI 系统的基础。4.2 Android 图形系统的 JNI 接口 Canvas.cpp 是 JNI 中核心的接口,为JAVA 上层的 android.graphics.Canvas类提供了支持。static SkCanvas*initRaster(JNIEnv*env,jobject,SkBitmap*bitmap)re

30、turn bitmap?new SkCanvas(*bitmap):new SkCanvas;static SkCanvas*initGL(JNIEnv*env,jobject)return new SkGLCanvas;4.3 Android 的图形类 Android 的图形类的包是 android.graphic,它通过调用图形系统的 JNI 提供了对 JAVA 框架中图形系统的支持。Android 的图形包为 android.graphics,其代码的路径:frameworks/graphics/java/android/graphics/4.3 Android 的图形类 Canvas.

31、java 实现图形系统中最为重要的一个类:android.graphics.Canvas。Canvas“类处理 draw”的调用,当绘制(draw)内容的时候需要 4 个基本的组件:一个保持像素的 A Bitmap,一个处理绘制调用的Canvas(写入 bitmap),绘制的内容(例如Rect,Path,text,Bitmap)和一个 paint(用来描述颜色和样式)。第五部分 3D 图形系统5.1 3D 图形系统结构5.2 OpenGL 的本地代码5.3 OpenGL 的 JAVA 和 JNI 代码 5.1 OpenGL 系统结构l i bEG L l i bG LESv1_CM com.g

32、oogle.android.gles_jnijavax.microedition.khronos.opengles(标准内容)JAVA框架本地框架egl_native_window_tSurfaceSystemOpenGL引擎OpenGL JNIl i bG LESv2底层实现GLSurfaceViewandroid.openglGLES10GLES11GLES20 5.2 OpenGL 的本地部分OpenGL 的本地代码:frameworks/base/opengl/libagl/frameworks/base/opengl/libs/OpenGL 的本地头文件:frameworks/bas

33、e/opengl/include/EGL/frameworks/base/opengl/include/GLES/OpenGL 的库:libEGL.so(EGL 库)libGLESv1_CM.so(OpenGL ES 库的封装)libagl.so(OpenGL 的软件实现库)Android Eclair 中版本之后 libagl 的库名称为libGLES_android.so,放置到目标系统的目录system/lib/egl。新增 OpenGL ES2 的支持:frameworks/base/opengl/libs/ELGS_CM库的名称为 libGLESv2.so,它与 libGLESv1_

34、CM.so是并列关系。5.2 OpenGL 的本地部分 5.3 OpenGL 的 JAVA 和 JNI 代码 Android 的 OpenGL 的实现方法是使用一个类来继承 OpenGL JAVA 的标准类,通过对这个类的实现,实现 OpenGL 的功能,在 JAVA 层只需要使用标准类。在 JAVA 应用中使用的类:javax.microedition.khronos.openglesjavax.microedition.khronos.eglandroid.opengl 5.3 OpenGL 的 JAVA 和 JNI 代码JAVA 代码:javax.microedition.khronos

35、.opengles(JAVA 标准类):opengl/java/javax/microedition/khronos/egl/(GL10.java GL11.java)opengl/java/javax/microedition/khronos/opengles/(EGL10.java)com.google.android.gles_jni(Android 的 GLES 的实现类)opengl/java/com/google/android/gles_jni/JNI 代码:com.google.android.gles_jni JNI:core/jni/com_google_android_g

36、les_jni_GLImpl.cppcore/jni/com_google_android_gles_jni_EGLImpl.cpp 5.3 OpenGL 的 JAVA 和 JNI 代码android.opengl 的代码路径:opengl/java/android/opengl/核心的文件:opengl/java/android/opengl/GLSurfaceView.javapublic class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback Android 的 android.opengl 是一

37、个OpenGL 相关的包,它主要提供了为 OpenGL 的输出界面。5.3 OpenGL 的 JAVA 和 JNI 代码 在 Android 的 JAVA 应用中使用 OpenGL 通常需要javax.microedition.khronos.opengles 类和android.opengl 包的结合使用。public class XXXActivity extends Activity Override protected void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);mGLSurfac

38、eView=new XXXGlSurfaceView(this);setContentView(mGLSurfaceView);mGLSurfaceView.requestFocus();mGLSurfaceView.setFocusableInTouchMode(true);private GLSurfaceView mGLSurfaceView;class XXXGlSurfaceView extends GLSurfaceView private class CubeRenderer implements GLSurfaceView.Renderer/*.*/*.*/第六部分 GUI 系

39、统结构 Android 的 GUI 系统由 Windows 和View 两个方面。WindowManagerService(窗口管理器)服务是底层的实现,进行了复杂的处理,调用了系统的多个部分。ViewRoot 实现了框架层中对窗口管理器的使用。第六部分 窗口和视图结构W in d o w M an a g e rS e rvice(ja va)IW in d o w M an a g e r(aidl)V ie w R o o tservices.jarV ie w M a n a g e rW in d o w M an a g e rW in d o w M a n ag e rIm p

40、 lV ie wframework.jarV ie w P a re n t 第六部分 窗口和视图结构 WindowManagerService 的底层实现在services.jar 包中。services/java/com/android/server/WindowManagerService.java IWindowManager 的接口用 aidl 的文件来描述。core/java/android/view/IWindowManager.aidl 第六部分 窗口和视图结构 WindowManagerService 的底层实现在services.jar 包中。services/java/com/android/server/WindowManagerService.java IWindowManager 的接口用 aidl 的文件来描述。core/java/android/view/IWindowManager.aidl 谢谢!

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁