本文试图讲述Android图形系统的底层实现。Android图形系统底层实现非常复杂,文档较少,没有使用比较流行的图形组建如X window, Cairo等。
图片在附件中
Android中的图形系统采用Client/Server架构。Server (即SurfaceFlinger)主要由c++代码编写而成。Client端代码分为两部分,一部分是由Java提供的供应用使用的api,另一部分则是由c++写成的底层实现。下图概要介绍了android图形系统的架构以及使用到的主要组件。
Android图形系统中一个重要的概念和线索是surface。View及其子类(如TextView, Button)要画在surface上。每个surface创建一个Canvas对象(但属性时常改变),用来管理view在surface上的绘图操作,如画点画线。每个canvas对象对应一个bitmap,存储画在surface上的内容。
每个Surface通常对应两个buffer,一个front buffer, 一个back buffer。其中,back buffer就是canvas绘图时对应的bitmap (研究android_view_Surface.cpp::lockCanvas)。因此,绘画总是在back buffer上,需要更新时,则将back buffer和front buffer互换。
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
Except for SurfaceViews, different views within the same ViewRoot share the same surface.
Layer的概念:
每个surface又对应一个layer, SurfaceFlinger负责将各个layer的front buffer合成(composite)绘制到屏幕上。
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
Multiple layers are just composited to the final buffer in their Z order.
有几个对象与Surface概念紧密相关:
1. Java Surface (frameworks/base/core/java/android/view/Surface.java)。该对象被应用间接调用(通过SurfaceView, ViewRoot等), 应用需要创建surface,(并同时创建canvas), 将图形绘制到这个对象上并最终投递到屏幕上。
2. C++ Surface (frameworks/base/libs/ui/Surface.cpp。 这个对象被Java Surface通过Jni 调用,实现Java Surface 的功能
3. ISurface (以及其派生类BnSurface)。这个对象是应用和server之间的接口。C++ Surface创建这个ISurface (BnSurface)并发送命令,如更新surface内容到屏幕上。Server端接受这个命令并执行相应操作。
研究一个surface如何创建的关键路径如下:
1. frameworks/base/core/java/android/view/Surface.java -- Surface::Surface ()
2. frameworks/base/core/jni/android_view_Surface.cpp -- Surface_init ()。在这个函数中SurfaceComposerClient 对象被创建。
3. frameworks/base/libs/ui/SurfaceComposerClient.cpp -- SurfaceComposerClient::SurfaceComposerClient (). 这个函数非常重要,在这里建立了client和server之间的桥梁。通过函数_get_surface_manager()获得了一个指向server的IBinder 对象(具有ISurfaceComposer接口),之后通过这个IBinder就可以跨进程访问Server的功能。接着调用ISurfaceComposer::createConnection()创建并返回了一个ISurfaceFlingerClient的IBinder。
4. frameworks/base/libs/ui/SurfaceComposerClient.cpp -- SurfaceComposerClient::createSurface().这个函数中,利用前面获得的ISurfaceFlingerClient的IBinder,调用其createSurface接口。
5.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp -- BClient::createSurface ()。BClient由ISurfaceFlingerClient派生而来。
6. frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp -- SurfaceFlinger:: createSurface()。这个函数为Surface创建一个对应的Layer。
上述关键路径中,1,2,3,4运行于client进程中,而5,6运行与server进程中。server作为一个service提供给client访问。
与图形相关的代码主要位于下列目录:
1、frameworks/base/graphics/java/android/graphics
2、frameworks/base/core/java/android/view
3、frameworks/base/core/java/android/widget
4、frameworks/base/opengl/
5、frameworks/base/libs/ui
6、frameworks/base/libs/surfaceflinger
7、frameworks/base/core/jni/android/graphics
8、frameworks/base/core/jni/android/opengl
9、frameworks/base/core/jni/android/android_view_*.cpp
10、external/skia
一、下列目录中的部分代码:
1、frameworks/base/graphics/java/android/graphics
2、frameworks/base/core/java/android/view
3、frameworks/base/core/java/android/widget
android.graphics, android.view和android.widget功能和其他类似的图形库如Qt/Gtk+差不多,分别提供基本的图形原语(如画点画线,设置图形上下文等),事件机制,以及开发图形用户界面的控件等。canvas 用于开发2D图形, Surface 代表一个可供图形系统绘制的surface。可在其上绘制2D活3D图形。
二. frameworks/base/opengl/
这个目录包含opengel的接口以及软件实现。在http://developer.android.com/guide/topics/graphics/opengl.html有详细介绍如何使用android.opengl开发3d graphics。
三.external/skia,台湾的Jserv先生有一篇比较好的介绍,感兴趣的读者可以参考他的博文(http://blog.linux.org.tw/~jserv/archives/002095.html)。简而言之,skia与cairo功能相当,封装底层的图形硬件,为上面的图形库提供最基础的操作图形硬件的原语。
四. frameworks/base/libs/ui 和 frameworks/base/libs/surfaceflinger
ISurface 定义了基础的Surface接口,供图形系统客户端(应用)和server端(即surfaceflinger)交互。
BpSurface是ISurface的派生类,提供接口供server 调用客户端功能;
BnSurface是ISurface的另一个派生类,提供接口供客户端调用server功能。当 server 收到来自客户端(通过BnSurace)的调用请求后,如registerBuffers, postBuffer等,BnSurface::onTransact被触发。
Surface (LayerBaseClient的私有类)是BnSurface的派生类。
SurfaceBuffer (SurfaceBuffer的私有类)是Surface的派生类。
ISurfaceComposer 定义了基础的接口,供客户端和server端交互。
BpSurfaceComposer是一个派生类,提供接口供server调用客户端功能;
BnSurfaceComposer是另一派生类,提供接口供客户端调用server功能。类 SurfaceFlinger 由BnSurfaceComposer派生而来。
SurfaceComposerClient直接供客户端使用,调用ISurface (BnSurface)和 ISurfaceComposer (BnSurfaceComposer)以及 ISurfaceFlingerClient 接口,与server交互。
BClient 派生自ISurfaceFlingerClient (BnSurfaceFlingerClient),调用server的createSurface,真正创建一个surface。每个surface对应一个layer.
egl_native_window_t 定义了一个本地window类 。这个类提供了对本地window的所有描述以及用于egl (opengl 与本地图形系统的接口)操作本地windwo的所有方法。
EGLNativeSurface是egl_native_window_t的一个派生类。
EGLDisplaySurface是EGLNativeSurface的派生类。 EGLDisplaySurface 是一个非常重要的类,在这个类里,真正打开framebuffer设备(/dev/graphics/fb0 或者/dev/fb0),并将这个设备封装成EGLDisplaySurface的形式供server使用。函数mapFrameBuffer打开framebuffer, 创建两个缓冲区,(一个是on screen front 缓冲区, 另一个back buffer, 可能位于offscreen framebuffer,也可能位于系统内存)。 函数swapBuffers将back buffer内容拷贝到front buffer中。
DisplayHardware 类中初始化了egl系统,并为本地窗口对象EGLDisplaySurface 创建了对应的EGLSurface 对象。surfaceflinger 使用DisplayHardware去和本地窗口打交道。
五、下列目录中的部分代码
7、frameworks/base/core/jni/android/graphics
8、frameworks/base/core/jni/android/opengl
9、frameworks/base/core/jni/android/android_view_*.cpp
这些目录下的代码在Java层的graphics 组件和native (c++)组件之间衔接,将java层的功能调用转换到对应的本地调用。
hardware/libhardware实现了HAL(Hardware Abstraction Layer)层,copybit device是其中一个模块。
- 大小: 8.3 KB
分享到:
相关推荐
《Android SDK 平台详解:聚焦 Android 25》 Android SDK(Software Development Kit)是开发者构建、调试和发布Android应用程序的重要工具集。在我们关注的"androidsdk-platforms-android-25.rar"压缩包中,包含的...
**Android SDK详解** Android SDK(Software Development Kit)是Google提供的一套工具,用于帮助开发者创建、调试和发布Android应用。它包括了多个组成部分: 1. **SDK Platforms**:这些是Android操作系统各个...
《Android SDK (SDK Platforms) - android-20详解》 Android SDK(Software Development Kit)是开发者构建、测试和调试Android应用程序所需的核心工具集。在Android SDK中,SDK Platforms扮演着至关重要的角色,它...
《Android Build-Tools在Linux环境下的使用详解》 在Android应用开发过程中,`build-tools`是必不可少的一个组件,它包含了构建Android应用所必需的各种工具。本文将深入探讨Android Build-Tools 28.0.3在Linux操作...
【Android 4.3 SDK与Android SDK 4.3 Platforms详解】 Android 4.3,代号为"Jelly Bean"(果冻豆),是Google发布的一个重要版本,它在2013年7月发布,是Android系统发展历程中的一个里程碑。这个版本的SDK...
**Android SDK-26详解** Android SDK(Software Development Kit)是开发者进行Android应用程序开发不可或缺的工具集,它包含了编译、调试、模拟等所需的各种组件。SDK 26对应的是Android 8.0(代号Oreo),这是一...
《Android NDK详解及其应用》 Android NDK(Native Development Kit)是Google为Android平台提供的一套用于开发原生代码的工具集,它允许开发者使用C++和其他本地语言编写应用程序,进而利用Android设备的硬件特性...
在命令行中输入`android`,启动图形界面的SDK Manager。在这里,你需要安装以下组件: 1. **Android SDK Tools**:基础工具,用于管理SDK。 2. **Android SDK Platform-Tools**:包含adb(Android Debug Bridge),...
### ANDROID-X86-4.0-RC2 安装配置详解 #### 一、概述 ANDROID-X86-4.0-RC2是一款基于Android 4.0(Ice Cream Sandwich)的操作系统版本,专门为x86架构的计算机设计。它能够运行在多种设备上,包括桌面电脑、...
《Android 底层接口与驱动开发技术详解》是一本深入探讨Android系统底层接口和驱动开发的专业书籍,适合对Android系统有深入研究需求的开发者阅读。本书涵盖了从硬件抽象层(HAL)到用户空间驱动,再到应用程序接口...
《Android核心技术和开发详解》是一本深入探讨Android应用开发的权威书籍,涵盖了广泛的技术主题,旨在帮助开发者掌握Android系统的精髓。这份压缩包包含了书中的5-8章的案例源代码,是学习Android开发的重要参考...
"Android优化技术详解"这一主题涵盖了多个方面,旨在帮助开发者构建高效、流畅的应用程序。下面,我们将深入探讨这些关键技术点。 首先,我们要理解Android应用性能的基础——内存管理。Android系统采用Dalvik/ART...
Android安全安全技术--16--Android系统安全(上).pdf Android安全安全技术--17--Android系统安全(下).pdf Android安全安全技术--18--ARM汇编语言.pdf Android安全安全技术--19--Small汇编语言.pdf Android安全...
**Android Studio IDE详解** Android Studio是Google为Android开发者推出的一款集成开发环境(IDE),它是基于IntelliJ IDEA的,专为高效开发Android应用程序而设计。这个版本号"141.1980579"表明这是一个较早的...
Android系统移植技术是一个复杂而精细的过程,涉及到多个层面的工作,包括环境配置、代码编译、设备驱动移植以及系统服务的定制。以下是对标题和描述中所提及知识点的详细解释: 1. **Android系统开发编译环境配置*...
Android系统移植技术详解 Android 系统移植技术是指将 Android 操作系统移植到特定的硬件平台上,使其能够在该平台上正常运行。移植过程中需要对系统编译环境进行配置,并下载相应的源代码,接着进行编译和调试。...
在Android系统中,底层接口和驱动开发是至关重要的部分,它们构成了Android运行的基础。本文将深入探讨这些领域的关键知识点,并结合提供的下载代码进行解析。 首先,Android底层接口是指Android系统与硬件之间的...