Android的GUI系统Android的GUI系统第一部分AndroidGUI系统综述第二部分pixelflinger和libui库第三部分Surface系统第五部分Skia系统第六部分OpenGL系统架构第一部分AndroidGUI系统综述libpixelflingerSurfaceFlingerlibuiSurfaceOverlayCameraEglWindowsformatKey/EventSkia图形引擎OpenGL3D引擎android.graphics.Canvasandroid.view.SurfaceGraphicJNISurfaceJNIandroid.view.ViewGLSurfaceViewjavax.microedition.khronos.opengles各种GUI元素OpenGLJNIcom.google.android.gles_jniFrameBuffer驱动C框架层JAVA框架Event输入驱动第一部分AndroidGUI系统综述Android的GUI系统由C语言的框架和JAVA语言的框架组成。GUI系统的C语言部分包括:PixelFlingerlibui(框架库)SurfaceFlinger(Surface的管理)Skia图形图像引擎OpenGL3D引擎各种JNI(向JAVA提供接口)第一部分AndroidGUI系统综述GUI系统JAVA语言的核心包括:android.graphics(对应Skia底层库)android.view.Surface(构建显示介面)android.view.View及其继承者(用于构建UI元素)OpenGL的功能类javax.microedition.khronos.opengles(由com.google.android.gles_jni实现)第二部分pixelflinger和libui库2.1pixelflinger2.2libui2.1pixelflingerlibpixelflingner.so是一个下层的工具性的类,这个类对外的主要内容是GGLContext结构,以及初始化和卸载的函数。system/core/include/pixelflinger/system/core/libpixelflinger/ssize_tgglInit(GGLContext**context);ssize_tgglUninit(GGLContext*context);libpixelflingner.so这个库对其他的库没有依赖,也并不提供实际的功能,类似一个用于管理工具的库。2.2libuilibui是一个框架性质的集成库,它不仅是显示的中枢,也是整个GUI系统的中枢。UIlib(libui→libpixelflinger),这个的相关内容在以下的路径中:frameworks/base/include/ui/framework/base/libs/ui/libui包含了颜色格式,用于实际显示的Egl窗口,按键及事件处理,Suface界面,Overlay,Camera等几个方面的接口。2.2libuiformat部分:这个部分本身定义颜色空间的枚举和数据结构,它需要充用pixelflinger中的一些关于数据格式定义。EglWindows部分:包含了EGL头文件构建的egl_native_window_t,它依赖OpenGL的结构,并给libEGL使用的。EGLDisplaySurface操作了硬件的framebuffer的驱动。这也是整个系统显示的基础。Key/Event部分:这是Android系统输入的基础,其中定义按键的映射,通过操作event事件设备来实现获取系统的输入的。2.2libuiSurface:Surface相关的头文件和实现为SurfaceFlinger定义接口和框架。Overlay:定义视频输出的接口。Camera:定义摄像头的框架和接口。输出部分的硬件抽象(donut之前):EGLDisplaySurface.cpp调用标准的FrameBuffer驱动。2.3Android的显示输出系统Android使用标准的framebuffer作为驱动程序,Android的本地框架中提供了系统和framebuffer驱动程序之间的适配层(硬件抽象层)。GrallocModule是Eclair版本之后显示部分的抽象层,它是系统和Framebuffer设备的接口,以硬件模块的形式存在。头文件路径:hardware/libhardware/include/hardware/gralloc.hGralloc模块实现:hardware/libhardware/modules/gralloc/Gralloc被libui使用。2.3Android的显示输出系统Gralloc.h中包含了Gralloc模块需要具有的接口。typedefstructgralloc_module_t{structhw_module_tcommon;int(*registerBuffer)(structgralloc_module_tconst*module,buffer_handle_thandle);int(*unregisterBuffer)(structgralloc_module_tconst*module,buffer_handle_thandle);int(*lock)(structgralloc_module_tconst*module,buffer_handle_thandle,intusage,intl,intt,intw,inth,void**vaddr);int(*unlock)(structgralloc_module_tconst*module,buffer_handle_thandle);int(*perform)(structgralloc_module_tconst*module,intoperation,...);void*reserved_proc[7];}gralloc_module_t;2.3Android的显示输出系统enum{GRALLOC_USAGE_SW_READ_NEVER=0x00000000,GRALLOC_USAGE_SW_READ_RARELY=0x00000002,GRALLOC_USAGE_SW_READ_OFTEN=0x00000003,GRALLOC_USAGE_SW_READ_MASK=0x0000000F,GRALLOC_USAGE_SW_WRITE_NEVER=0x00000000,GRALLOC_USAGE_SW_WRITE_RARELY=0x00000020,GRALLOC_USAGE_SW_WRITE_OFTEN=0x00000030,GRALLOC_USAGE_SW_WRITE_MASK=0x000000F0,/*bufferwillbeusedasanOpenGLEStexture*/GRALLOC_USAGE_HW_TEXTURE=0x00000100,/*bufferwillbeusedasanOpenGLESrendertarget*/GRALLOC_USAGE_HW_RENDER=0x00000200,/*bufferwillbeusedbythe2Dhardwareblitter*/GRALLOC_USAGE_HW_2D=0x00000C00,/*bufferwillbeusedwiththeframebufferdevice*/GRALLOC_USAGE_HW_FB=0x00001000,/*maskforthesoftwareusagebit-mask*/GRALLOC_USAGE_HW_MASK=0x00001F00,};2.3Android的显示输出系统Gralloc模块是显示模块的实现。其中,framebuffer.cpp用于基于framebuffer的显示实现,gralloc是基于pmem的实现。intgralloc_device_open(consthw_module_t*module,constchar*name,hw_device_t**device){intstatus=-EINVAL;if(!strcmp(name,GRALLOC_HARDWARE_GPU0)){gralloc_context_t*dev;dev=(gralloc_context_t*)malloc(sizeof(*dev));memset(dev,0,sizeof(*dev));dev-device.common.tag=HARDWARE_DEVICE_TAG;dev-device.common.version=0;dev-device.common.module=const_casthw_module_t*(module);dev-device.common.close=gralloc_close;dev-device.alloc=gralloc_alloc;dev-device.free=gralloc_free;*device=&dev-device.common;status=0;}else{status=fb_device_open(module,name,device);}returnstatus;}2.3Android的显示输出系统libui对gralloc模块实现了调用,在ui/FramebufferNativeWindow.cpp中打开了gralloc设备。FramebufferNativeWindow::FramebufferNativeWindow():BASE(),fbDev(0),grDev(0),mUpdateOnDemand(false){hw_module_tconst*module;if(hw_get_module(GRALLOC_HARDWARE_MODULE_ID,&module)==0){intstride;interr;err=framebuffer_open(module,&fbDev);LOGE_IF(err,couldn'topenframebufferHAL(%s),strerror(-err));err=gralloc_open(module,&grDev);LOGE_IF(err,couldn'topengrallocHAL(%s),strerror(-err));//......}2.3Android的显示输出系统2.4Android的用户输入系统Android输入系统由Event驱动程序,libui中的EventHub和JAVA框架中的几个类组成。Event的功能被集成在android.view包的View类中,在应用程序层调用主要通过View类及其继承者。KeyEvent和MotionEvent的处理方法略有不同,KeyEvent通过转化按键码得到,MotionEvent通过转化RawEvent得到。2.4Android的用户输入系统libuiEventHubJavaFrameworkJavaApplicationNativeFramework/dev/input/KernelRawInputEventKeyInputQueue*.klKeyInputDeviceMotionEventRawInputEventKeyEventKeyEventWindowManagerServiceServiceAndrido.view.ViewonKeyDownonKeyUponTouchEventonTrackballEventtransferTouch/Mouse/KeyKeyLayoutMapKeyCharacterMap*.kcm输入部分的硬件抽象:EventHub.cpp调用标准的Event设备驱动。KeyCodeLabel.h=android/view/KeyEvent.javaqwer