【Android源码 栏目提醒】:网学会员为需要Android源码 的朋友们搜集整理了[IT计算机]10_Android的GUI系统 - 技术总结相关资料,希望对各位网友有所帮助!
韩超
Android技术 第一部分
Android GUI系统综述 第二部分GUI框架libui库及相关 第三部分Surface系统 第四部分2D 图形系统 第五部分3D 图形系统 第六部分窗口和视图结构 libpixelflinger SurfaceFlinger libuiSurfaceOverlayCameraEglWindowsformat Key / EventSkia图形引擎OpenGL3D引擎
android.graphics.Canvasandroid.view.SurfaceGraphic JNISurface JNIandroid.view.ViewGLSurfaceView javax.microedition.khronos.opengles各种GUI元素OpenGL JNIcom.google.
android.gles_jniFrameBuffer驱动C框架层JAVA框架Event输入驱动
Android的GUI系统由C语言的框架和JAVA语言的框架组成。
GUI系统的C语言部分包括 PixelFlinger libui框架库 SurfaceFlingerSurface的管理 Skia图形图像引擎 OpenGL 3D 引擎 各种JNI向JAVA提供接口 GUI系统JAVA语言的核心包括
android.graphics对应Skia底层库
android.view.Surface构建显示介面
android.view.View及其继承者 用于构建UI元素 OpenGL 的功能类 javax.microedition.khronos.opengles 由com.google.
android.gles_jni实现 2.1 pixelflinger2.2 libui libpixelflingner.so是一个下层的工具性的类这个类对外的主要内容是GGLContext结构以及初始化和卸载的函数。
system/core/include/pixelflinger/ system/core/libpixelflinger/ssize_t gglInitGGLContext contextssize_t gglUninitGGLContext context libpixelflingner.so这个库对其他的库没有依赖也并不提供实际的功能类似一个用于管理工具的库。
libui是一个框架性质的集成库它不仅是显示的中枢也是整个GUI系统的中枢。
UI lib libui → libpixelflinger 这个的相关内容在以下的路径中frameworks/base/include/ui/frameworks/base/libs/ui/ libui包含了颜色格式用于实际显示的Egl窗口按键及事件处理Suface界面OverlayCamera等几个方面的接口。
format部分 这个部分本身定义颜色空间的枚举和数据结构它需要充用pixelflinger中的一些关于数据格式定义。
EglWindows部分 包含了EGL头文件构建的egl_native_window_t是整个系统显示的基础。
Key/Event部分 这是
Android系统输入的基础其中定义按键的映射通过操作event事件设备来实现获取系统的输入的。
Surface Surface相关的头文件和实现为SurfaceFlinger定义接口和框架。
头文件include/surface/Overlay 定义视频输出的接口。
Camera 定义摄像头的框架和接口。
头文件include/camera/ 3.1 Surface系统的结构3.2 SurfaceFlinger本地代码3.3 Surface的Java和Jni代码 Surface系统的结构 libui.so或libsurfacefilnger_client.so提供Surface部分的本地接口。
libsurfacefilnger.so提供实现。
Java框架主要调用Surface向UI提供接口。
Navtive部分主要使用ISurface。
registerBufferspostBufferunregisterBuffersISurfaceBnSurfaceIDsetLayersetPositionsetSizesetAlphagetIdentitydirtyRegionsetDirtyRegion-mClient-mSurfaceSurfacecreateSurfacedestroySurfaceISurfaceFlingerClientBnSurfaceFlingerClientcreateConnectionfreezeDisplayunfreezeDisplaysetOrientationbootFinishedrequestGPUrevokeGPUISurfaceComposerBnSurfaceComposercreateSurface-ISurfaceFlingerClientSurfaceComposerClientSurface系统的接口 Surface系统的头文件路径frameworks/base/include/ui/或include/surfaceflinger/:ISurface.hISurfaceComposer.hISurfaceFlingerClient.hSurface.hSurfaceComposerClient.h Surface系统的源代码文件路径frameworks/base/libs/surfaceflinger_client/ISurfaceComposer.cpp LayerState.cpp SurfaceComposerClient.cppISurfaceComposerClient.cpp ISurface.cpp SharedBufferStack.cpp Surface.cpp Surfaceflinger的实现者路径frameworks/base/services/surfaceflinger/ SurfaceFlinger类继承了ISurfaceComposer是一个核心的实现。
LayerLayerBufferLayerDim和LayerBlur是不同层的实现。
class SurfaceControl : public RefBasepublic:// ...... 省略部分内容 uint32_t getFlags const return mFlags uint32_t getIdentity const return mIdentity void clear status_t setLayerint32_t layer status_t setPositionint32_t x int32_t y status_t setSizeuint32_t w uint32_t h status_t hide status_t showint32_t layer -1 status_t freeze status_t unfreeze status_t setFlagsuint32_t flags uint32_t mask status_t setTransparentRegionHintconst Region transparent status_t setAlphafloat alpha1.0f sp getSurface const// ......省略部分内容 Surface.h中的SurfaceControl类 class ISurface : public IInterface class BufferHeap virtual status_t registerBuffersconst BufferHeap buffers 0 virtual void postBufferssize_t offset 0 // one-way virtual void unregisterBuffers 0 virtual sp createOverlay uint32_t w uint32_t h int32_t format int32_t orientation 0 ISurface.h中的ISurface类这个类主要被本地的代码所调用。
createSurfacedestroySurface-mId-mFlingerBClientcreateConnectionfreezeDisplayunfreezeDisplaysetOrientationbootFinishedrequestGPUrevokeGPUSurfaceFlingersetPositionsetLayersetSizesetAlphagetTypeIDgetTypeInfoLayerBasegetSurface-client-clientIndex-getIdentityLayerBaseClientgetSurfaceDataregisterBufferspostBufferunregisterBuffersLayerBaseClient::SurfaceLayerBuffergetSurfaceDataregisterBufferspostBufferunregisterBuffersLayerBuffer::SurfaceBufferLayerBlurgetLayerUsergetLayersgetSurfaceHeapManagerClientregisterBufferspostBufferunregisterBuffersISurfaceBnSurfaceIDsetLayersetPositionsetSizesetAlphagetIdentitydirtyRegionsetDirtyRegion-mClient-mSurfaceSurfacecreateSurfacedestroySurfaceISurfaceFlingerClientBnSurfaceFlingerClientcreateConnectionfreezeDisplayunfreezeDisplaysetOrientationbootFinishedrequestGPUrevokeGPUISurfaceComposerBnSurfaceComposercreateSurface-ISurfaceFlingerClientSurfaceComposerClientLayerDimLayer接口层SurfaceFlinger实现层 class ISurfaceComposer : public IInterfacepublic: enum // keep in sync with Surface.java eHidden 0x00000004 eGPU 0x00000008 eHardware 0x00000010 eDestroyBackbuffer 0x00000020 eSecure 0x00000080 eNonPremultiplied 0x00000100 ePushBuffers 0x00000200 eFXSurfaceNormal 0x00000000 eFXSurfaceBlur 0x00010000 eFXSurfaceDim 0x00020000 eFXSurfaceMask 0x000F0000 enum ePositionChanged 0x00000001 / ... ... / enum eLayerHidden 0x01 / ... ... / enum eOrientationDefault 0 / ... ... / 各个类型的Surface层之间的关系:class LayerBaseClient : public LayerBase class Surface : public BnSurface class Layer : public LayerBaseClientclass LayerBuffer : public LayerBaseClient class SurfaceBuffer : public LayerBaseClient::Surfaceclass LayerDim : public LayerBaseClientclass LayerBlur : public LayerBaseClient Create a Surface:SurfaceComposerClient::createSurface ISurface → Suface frameworks/base/libs/ui/SurfaceComposerClient.cpp→ IsurfaceFlingerClient:: createSurface→ Bclient::createSurface framework/base/libs/surfaceflinger/SurfaceFlinger.cpp→ SurfaceFlinger::createSurface framework/base/libs/surfaceflinger/SurfaceFlinger.cppLayerBaseClient layer 0sp surfaceHandle eFXSurfaceNormal → Layer or LayerBuffer eFXSurfaceBlur → LayerBlur eFXSurfaceDim → LayerDimsurfaceHandle layer-getSurfacesetSize:Surface::setSize→ SurfaceComposerClient::setSize SurfaceSurfaceComposerClientandroid/view/Surfaceandroid/view/SurfaceSessionsetLayersetPositionsetPositionandroid.view.Surfaceandroid.view.SurfaceSessiongetHolder-mSurface-mSurfaceHolderandroid.view.SurfaceViewgetSurfacelockCanvassetFixedSizesetFormatsetKeepScreenOnsetSizeFromLayoutsetTypeunlockCanvasAndPostandroid.view.SurfaceHolderandroid.view.SurfaceView::SurfaceHolderandroid.view.viewlibui.soJNIJAVA FrameworkJAVAApplicationz include include const char const kSurfaceSessionClassPathName
android/view/SurfaceSessionconst char const kSurfaceClassPathName
android/view/Surfacestatic void nativeClassInitJNIEnv env jclass clazzJNI的代码路径:frameworks/base/core/jni/
android_view_Surface.cpp 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接口来完成来控制的硬件载体。
关于
android.view包中的View类 View 类呈现了最基本的UI构造块。
一个视图占据 屏幕上的一个方形区域并且负责绘制和时间处理。
View 是widgets的基类常用来创建交互式的用户图形界面GUI 。
View中包含了一个Surface并处理onDrawCanvas事件。
4.1 Skia底层库4.2
Android图形系统的JNI接口4.3
Android的图形类 skia-opengl glue librarylibskiagl.soSGLSkia Graphic liblibskia.solibjpglibgiflibpnglibft2Codec PluginSkiaCodecSkia
Android PortingAndroid basic libSkia APIandroid.view.SurfaceCanvasandroid.graphics.C框架层Java框架GraphicsJNIandroid.view.View Skia是Google一个底层的图形图像动画SVG文本等多方面的图形库它是
Android中图形系统的引擎。
Skia代码的路径 external/skia/ Skia主要的库 Skia 图形库libskia.so skia-opengl glue librarylibskiagl.so Skia主要包含三个库的代码路径 核心图形部分src/core/ Skia 功能部分src/effects/src/images/src/ports/src/core/src/utils/ skia-opengl glue librarysrc/gl/
Android的图形系统和Skia底层库的联系比 较紧密。
Android的图形系统的JNI提供了从Skia底层库到JAVA上层的支持。
Android的图形系统的JNI代码的路径 frameworks/base/core/jni/
android/graphics/
Android的图形系统对JAVA层提供了绘制基本图形的功能是GUI系统的基础。
Canvas.cpp是JNI中核心的接口为JAVA上层的
android.graphics.Canvas类提供了支持。
static SkCanvas initRasterJNIEnv env jobject SkBitmap bitmap return bitmap new SkCanvasbitmap : new SkCanvas static SkCanvas initGLJNIEnv env jobject return new SkGLCanvas
Android的图形类的包是
android.graphic它通过调用图形系统的JNI提供了对JAVA框架中图形系统的支持。
Android的图形包为
android.graphics其代码的路径 frameworks/graphics/java/
android/graphics/ Canvas.java实现图形系统中最为重要的一个类
android.graphics.Canvas。
Canvas“类处理draw” 的调用当绘制draw内容的时候需要4个基本的组件一个保持像素的A Bitmap一个处理绘制调用的Canvas写入bitmap 绘制的内容例如RectPathtext Bitmap和一个paint 用来描述颜色和样式。
5.1 3D图形系统结构5.2 OpenGL的本地代码5.3 OpenGL的JAVA和JNI代码 libEGL libGLESv1_CM com.google.
android.gles_jnijavax.microedition.khronos.opengles标准内容JAVA框架本地框架egl_native_window_tSurfaceSystemOpenGL引擎OpenGL JNIlibGLESv2底层实现GLSurfaceViewandroid.openglGLES10GLES11GLES20 OpenGL的本地代码:frameworks/base/opengl/libagl/frameworks/base/opengl/libs/OpenGL的本地头文件:frameworks/base/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_CM.so是并列关系。
Android的OpenGL的实现方法是使用一个类来继承OpenGL JAVA的标准类通过对这个类的实现实现OpenGL的功能在JAVA层只需要使用标准类。
在JAVA应用中使用的类javax.microedition.khronos.openglesjavax.microedition.khronos.eglandroid.opengl JAVA代码javax.microedition.khronos.openglesJAVA标准类:opengl/java/javax/microedition/khronos/egl/GL10.java GL11.javaopengl/java/javax/microedition/khronos/opengles/EGL10.javacom.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_gles_jni_GLImpl.cppcore/jni/com_google_
android_gles_jni_EGLImpl.cpp
android.opengl的代码路径:opengl/java/
android/opengl/核心的文件:opengl/java/
android/opengl/GLSurfaceView.javapublic class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
Android的
android.opengl是一个OpenGL相关的包它主要提供了为OpenGL的输出界面。
在
Android的JAVA应用中使用OpenGL通常需要javax.microedition.khronos.opengles类和
android.opengl包的结合使用。
public class XXXActivity extends Activity Override protected void onCreateBundle savedInstanceState super.onCreatesavedInstanceState mGLSurfaceView new XXXGlSurfaceViewthis setContentViewmGLSurfaceView mGLSurfaceView.requestFocus mGLSurfaceView.setFocusableInTouchModetrue private GLSurfaceView mGLSurfaceViewclass XXXGlSurfaceView extends GLSurfaceView private class CubeRenderer implements GLSurfaceView.Renderer / ... .../ / ... .../
Android的GUI系统由Windows和View两个方面。
WindowManagerService窗口管理器服务是底层的实现进行了复杂的处理调用了系统的多个部分。
ViewRoot实现了框架层中对窗口管理器的使用。
WindowManagerServicejavaIWindowManager aidlViewRootservices.jarViewManagerWindowManagerWindowManagerImplViewframework.jarViewParent 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