Android Surface系统的实现
- 格式:docx
- 大小:280.56 KB
- 文档页数:6
surfacetexture例子1.介绍S u rf ac eT ex tu re是A nd ro id平台上用于处理视频纹理的一个类。
它提供了一种将视频帧作为Op en GL纹理进行处理的方式,使开发者可以在不进行像素复制的情况下对视频进行实时处理。
2. Su rfaceTextur e的基本用法2.1创建S u r f a c e T e x t u r e对象要使用Su rf ac eT ext u re,首先需要创建一个Su rf ac eT ext u re对象。
我们可以使用以下代码来创建一个Su rf ac e Te xt ur e对象:```j av aS u rf ac eT ex tu re sur f ac eT ex tu re=n ewS u rf ac eT ex tu re(0);```这里的参数0表示使用默认的纹理I D。
如果要使用自定义的纹理I D,可以将相应的纹理ID传递给Su rf ac eT ex t ur e的构造函数。
2.2将S u r f a c e T e xt u r e绑定到O p e n GL纹理创建好S ur fa ce Te xt u re对象后,我们需要将其绑定到一个O pe nG L纹理上,以便能够对视频帧进行处理。
可以使用以下代码将S u rf ac eT ex tu re绑定到一个Op en GL纹理:```j av ai n tt ex tu re Id=...;//自定义纹理IDs u rf ac eT ex tu re.at t ac hT oG LC on te xt(t ex tu re Id);```2.3更新视频帧一旦将S ur fa ce Te xt u re对象绑定到了一个Op en GL纹理上,就可以通过Su rf ac eT ex tur e的u pd at eT ex Ima g e()方法来更新视频帧。
可以使用以下代码来更新视频帧:```j av as u rf ac eT ex tu re.up d at eT ex Im ag e();```更新视频帧后,可以通过Op en GL的纹理函数对纹理进行进一步的处理,例如进行滤镜效果、混合等。
Android之SurfaceView详解展开全文SurfaceView介绍通常情况程序的View和用户响应都是在同一个线程中处理的,这也是为什么处理长时间事件(例如访问网络)需要放到另外的线程中去(防止阻塞当前UI线程的操作和绘制)。
但是在其他线程中却不能修改UI元素,例如用后台线程更新自定义View(调用View的在自定义View中的onDraw函数)是不允许的。
如果需要在另外的线程绘制界面、需要迅速的更新界面或则渲染UI界面需要较长的时间,这种情况就要使用SurfaceView了。
SurfaceView中包含一个Surface对象,而Surface是可以在后台线程中绘制的。
Surface属于 OPhone底层显示系统。
SurfaceView 的性质决定了其比较适合一些场景:需要界面迅速更新、对帧率要求较高的情况。
使用SurfaceView需要注意以下几点情况:SurfaceView和SurfaceHolder.Callback函数都从当前SurfaceView 窗口线程中调用(一般而言就是程序的主线程)。
有关资源状态要注意和绘制线程之间的同步。
在绘制线程中必须先合法的获取Surface 才能开始绘制内容,在SurfaceHolder.Callback.surfaceCreated() 和SurfaceHolder.Callback.surfaceDestroyed()之间的状态为合法的,另外在Surface类型为SURFACE_TYPE_PUSH_BUFFERS时候是不合法的。
额外的绘制线程会消耗系统的资源,在使用SurfaceView的时候要注意这点。
使用SurfaceView 只要继承SurfaceView类并实现SurfaceHolder.Callback接口就可以实现一个自定义的SurfaceView 了,SurfaceHolder.Callback在底层的Surface状态发生变化的时候通知View,SurfaceHolder.Callback具有如下的接口:surfaceCreated(SurfaceHolder holder):当Surface第一次创建后会立即调用该函数。
Android:毛玻璃效果,快回来!如今,有很多系统都应用了毛玻璃效果,这样的模糊效果着实令很多开发者和用户深受喜爱,也觉得这种装饰极其具有个性。
在Android系统中也支持这种效果,它是由FLAG_BLUR_BEHIND(这是给开发者看的,安卓用户只需了解)这个常数起的作用。
FLAG_BLUR_BEHIND确实是Android系统中支持的一种窗口标志,它支持的是模糊效果(要将Activity的style设为translucent才有效果),就像上面图片所显示的那样。
美中不足的是经模糊处理后的图像有黑边,也有点褪色,但抛开这些缺点不谈,模糊效果在如今的应用开发中还是颇受欢迎的。
然而,有些开发者们发现,将FLAG_BLUR_BEHIND这个常数用在Android4.0版本以上时却丝毫没有效果。
用在透明的activity上啥用没有,原来是黑色背景的用后还是黑的,根本没有一点变化。
这是为什么呢?我前几天在开发APP时也想用到这个常数,就是想让应用界面更好看一点,但我发现在Android4.0以下的系统中能正常运行,但4.0版本之后的就不行。
这让我很是伤脑筋。
于是我决定翻翻Android 官方文档看看是什么原因,只见它这样写道:意思就是说这个常数早在Android4.0开始就已经废弃了,模糊效果也就不再支持了。
官方说是这么说,难道不应该给出一个具体的原因么?就凭这几行字,怎么可能让开发者知道常数被弃用的原因呢?谷歌官方这样做是好事么?只是弱弱的说几句,到底是什么原因造成不支持,我们要刨根问底,自己慢慢探寻其中的原因了。
我以前在开发应用时也曾用过这个常数,但只要用了这个,我发现下拉状态栏时很不流畅,并且占用系统资源较大,将其弃用也是理所当然。
我在网上也找了一些该常数被弃用的原因,目前为止,我发现的一种说法是:“Android 早期版本确实有支持FLAG_BLUR_BEHIND ,但由于它不是用OpenGL ES 实时绘制,并且性能比较差,所以就在以后的版本废弃这个功能。
onsurfacetexturedestroyed return -回复"onsurfacetexturedestroyed return" 是什么?"onsurfacetexturedestroyed return" 是一个常见的技术术语,通常在Android 开发中见到。
它是一个回调函数,当一个SurfaceTexture 对象被销毁时触发。
这个回调函数可以在TextureView.SurfaceTextureListener 接口中实现,以便在SurfaceTexture 销毁时执行一些特定的操作。
在Android 开发中,SurfaceTexture 是一个用于在图形中显示图像的工具。
开发人员可以创建一个TextureView,然后使用SurfaceTexture 将图像渲染到该view 上。
然而,当这个TextureView 不再使用时,为了释放系统资源,需要销毁对应的SurfaceTexture。
这时,就会触发"onsurfacetexturedestroyed return" 方法。
下面我将一步一步回答您的问题,以便更好地理解"onsurfacetexturedestroyed return"。
第一步:了解SurfaceTextureSurfaceTexture 是一个用于将图像渲染到TextureView 的类。
它可以管理图像的缓冲区,并提供一些用于操作图像的方法。
通过SurfaceTexture,开发人员可以实现图像的显示、旋转、裁剪等操作。
第二步:创建TextureView在Android 开发中,我们可以使用TextureView 控件创建一个可用于显示图像的视图。
通过调用TextureView 的构造函数和setSurfaceTextureListener 方法,我们可以创建一个SurfaceTexture,并在SurfaceTexture 销毁时触发"onsurfacetexturedestroyed return" 方法。
Android SurfaceFlinger 详解1.SurfaceFlinger按英文翻译过来就Surface投递者。
就是把上层所画的各个surface 进行处理然后传给底层硬件来显示的一个功能。
2.下图比较详细的阐述了SurfaceFlinger 所起的作用。
Android图形系统中一个重要的概念和线索是surface。
View及其子类(如TextView, Button)要画在surface上。
每个surface创建一个Canvas对象(但属性时常改变),用来管理view在surface上的绘图操作,如画点画线。
每个canvas对象对应一个bitmap,存储画在surface上的内容。
每个Surface通常对应两个buffer,一个front buffer, 一个back buffer。
其中,back buffer就是canvas绘图时对应的bitmap。
因此,绘画总是在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, ViewRootwill call surface.unlockCanvasAndPost(canvas) to schedule surfaceFlinger::composeSurfaces() which do the actually displayto display panel. SurfaceFlinger handles to transfers drawn data in canvas to surface front buffer or backbufferExcept for SurfaceViews, different views within the same ViewRoot share the same surface.Layer的概念:每个surface又对应一个layer, SurfaceFlinger负责将各个layer的front buffer合成(composite)绘制到屏幕上。
在android开发过程中,APP需要用到摄像头录制视频音效、播放视频的功能,并且通过第三方线程调用Handler动态的addview和removeview添加和删除播放视频的组件——MediaPlayer。
有时就会产生The surface has been released错误。
一、产生异常原因每次在点播放按钮的时候,打开MediaPlayer的SurfaceView进行播放,再次点击则删除波翻组件,停止播放,这个过程中会遇到The surface has been released 错误,这个的原因是因为:在播放this.mediaPlayer.start()之前SurfaceView没有来的及调用onCreate()或者onChange()方法,导致holder没有成功加载,所以在start播放的时候抛出播放异常。
二、解决办法很简单的办法就是:1.设置一个boolean标志位isSurfaveCreated,在执行onCreate()或者onChange()之后,将isSurfaveCreated=true。
2.在停止播放之后isSurfaveCreated=false。
3.在MediaPlayer.setDisplay()之前使用while循环以及Thread.sleep(10)来循环检测isSurfaveCreated,只有isSurfaveCreated为true的时候,才继续执行,具体代码为:代码如下while (! this.isSurfaveCreated) {try {Thread.sleep(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}当然,这个办法自己感觉是一个非主流的办法,但是确实可以很好的避免这个问题,除此之外,大家自己考虑代码的安全稳定性等等因素,have fun!。
surfaceview 用法SurfaceView是Android中的一个视图控件,它可以在一个独立的线程中绘制图形,适用于需要频繁更新UI的场景,比如游戏开发、视频播放等。
在使用SurfaceView时,我们需要了解它的用法和一些常见的操作。
一、SurfaceView的基本用法1. 在布局文件中添加SurfaceView控件:```xml<SurfaceViewandroid:id="@+id/surfaceView"android:layout_width="match_parent"android:layout_height="match_parent" />```2. 在Activity中获取SurfaceView控件的引用:```javaSurfaceView surfaceView = findViewById(R.id.surfaceView);```3. 创建一个继承自SurfaceView的自定义视图类:```javapublic class MySurfaceView extends SurfaceView implementsSurfaceHolder.Callback {private SurfaceHolder surfaceHolder;public MySurfaceView(Context context) {super(context);init();}public MySurfaceView(Context context, AttributeSet attrs) { super(context, attrs);init();}private void init() {surfaceHolder = getHolder();surfaceHolder.addCallback(this);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// SurfaceView创建时调用,可以在这里进行绘制操作}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {// SurfaceView尺寸发生变化时调用,可以在这里进行绘制操作}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// SurfaceView销毁时调用,可以在这里释放资源}}```4. 在Activity中使用自定义的SurfaceView:```javaMySurfaceView mySurfaceView = new MySurfaceView(this);```5. 将自定义的SurfaceView添加到布局中:```javaFrameLayout frameLayout = findViewById(R.id.frameLayout); frameLayout.addView(mySurfaceView);二、SurfaceView的绘制操作1. 在surfaceCreated()方法中获取Canvas对象,并进行绘制操作:```java@Overridepublic void surfaceCreated(SurfaceHolder holder) {Canvas canvas = surfaceHolder.lockCanvas();// 进行绘制操作surfaceHolder.unlockCanvasAndPost(canvas);}```2. 在surfaceChanged()方法中获取Canvas对象,并进行绘制操作:```java@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {Canvas canvas = surfaceHolder.lockCanvas();// 进行绘制操作surfaceHolder.unlockCanvasAndPost(canvas);}```3. 在surfaceDestroyed()方法中释放资源:```java@Overridepublic void surfaceDestroyed(SurfaceHolder holder) { // 释放资源}```三、SurfaceView的常见操作1. 设置背景颜色:```javasurfaceView.setBackgroundColor(Color.RED);```2. 设置透明度:```javasurfaceView.setAlpha(0.5f);```3. 设置可见性:```javasurfaceView.setVisibility(View.VISIBLE);```4. 设置Z轴顺序:```javasurfaceView.setZOrderOnTop(true);```5. 设置点击事件:```javasurfaceView.setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) {// 处理点击事件}});```6. 设置触摸事件:```javasurfaceView.setOnTouchListener(new View.OnTouchListener() { @Overridepublic boolean onTouch(View v, MotionEvent event) { // 处理触摸事件return true;}});```总结:SurfaceView是Android中用于频繁更新UI的一个视图控件,它可以在独立的线程中进行绘制操作。
Android5.1中surface和CpuConsumer下生产者和消费者间的处理框架简述本文均属自己阅读源码的点滴总结,转账请注明出处谢谢。
欢迎和大家交流。
qq:1037701636 email:gzzaigcn2009@Software:系统源码Android5.1前沿:如果对SurfaceFlinger架构的工作原理较为熟悉的话,本文阅读起来会相对容易些。
之所以撰写本文是因为在阅读Camera HAL3的实现过程中大量的出现了类似与SurfaceFlinger的工作模式。
本文将以CallbackProcessor模块的为入口,和大家进行分享。
1 Preview模块Surface与SurfaceFlinger的基础知识开发过Android Camera模块的人,基本都应该熟悉实时采集的视频如果要显示到手机屏上,对应的Framework层就应该构建一个Surface对象,这对所有Android版本都是通用的。
该Surface本质是一个在APP端的ANativeWindow,是需要从SurfaceFlinger端的Gralloc模块获取Buffer的,然后填充帧图像数据并送显示的过程。
详细内容可以参考之前的专栏我心所向之Android4.2关于SurfaceFlinger相关的内容。
由于目前Android系统版本升级过快,在5.0以上的版本中SurfaceFlinger部分框架发生了变化(目前还没有深入去研读过),了解到的是:一方面他去掉了SurfaceTexture/SurfaceTextureClient等内容,增强了Surface的功能。
另一方面BufferQueue的使用也更加简单与明了,Producer与Consumer的关系也更加明确,BufferQueue不再是以前的消费者角色,转而成为ProducerBufferQueue和Consumer相互关联的桥梁。
此外,如果你在深入的话,会了解到Gralloc模块中非framebuff的缓存管理与共享不在是那个Ashmem匿名共享内存,而是出现了一种新的内存管理机制/dev/ION/,后面会和大家分享他部分的工作机制。
Android2.2、2.3、4.0 中如何使用GPU硬件加速原理和游戏3D性能的提升实现GPU渲染资料来自网络收集。
1.名词解释GPU:Graphic Processing Unit (图形处理器)OpenGL:Open Graphic Library 定义了一个跨编程语言、跨平台的编程接口的规格,不同厂商会有不同的实现方法,它主要用于三维图象(二维的亦可)绘制。
SurfaceFlinger:Android中负责Surface之间叠加、混合操作的动态库Skia:Android中的2D图形库libagl:Android中通过软件方法实现的一套OpenGL动态库libhgl:为区别libagl,自定义的一种叫法。
特指GPU厂商提供的硬件实现的OpenGL composition:特指SurfaceFlinger对各个Surface之间的叠加、混合操作render:特指使用OpenGL动态库进行3D渲染copybit:Android使用2D引擎来加速图形操作(主要是Surface之间的composition操作)的一种技术,对应着一个或几个动态库。
pmem:Android特有驱动,从linux内核中reserve物理连续内存,可以为2d、3d引擎、vpu等设备分配物理连续内存。
3D、2D引擎在Android中的使用方法2.1 Android如何使用2D、3D引擎Android在启动后,会在运行时根据配置文件加载OpenGL(libagl & libhgl)的实现,如果有libhgl实现,默认使用libhgl实现,否则使用libagl实现。
Android OpenGL动态库使用方法:1. 判断是否含有egl.cfg文件,如果没有在加载libagl2. 如果有egl.cfg文件,则解析egl.cfg文件,根据egl.cfg文件加载对应libhgl和libagl3. 分别解析libagl和libhgl,获取libagl和libhgl中标准OpenGL函数的函数地址(函数指针)4. 系统在执行过程中,会通过函数指针调用到libagl或者libhgl中去,从而实现图形的绘制。
android mediaplayer textureview渲染数据的原理
Android MediaPlayer和TextureView是Android中用于播放视
频的两个核心类,它们之间的原理如下:
1. MediaPlayer加载和解码视频数据:MediaPlayer负责从视频
文件、网络流或其他媒体源中读取数据,并进行解码。
它使用内部的解码器将读取的数据解码为原始图像数据和音频数据。
2. TextureView显示图像数据:TextureView是一个继承自
View的类,可以用于显示图像数据。
它通过SurfaceTexture来与底层图形渲染引擎进行交互。
当TextureView和MediaPlayer关联后,MediaPlayer将解码后的图像数据通过SurfaceTexture传递给TextureView。
3. SurfaceTexture与图形渲染引擎交互:SurfaceTexture是一个
用于与底层图形渲染引擎进行交互的类,它将图像数据传递给图形渲染引擎,由引擎进行渲染操作。
TextureView利用SurfaceTexture将渲染结果显示在屏幕上。
总结来说,当MediaPlayer解码视频数据后,将数据传递给SurfaceTexture,再由SurfaceTexture传递给TextureView进行
渲染,最终显示在屏幕上。
这个过程是Android系统内部的一
个底层操作,具体的实现细节涉及到多个系统组件的协同工作。
Android之Surface⼀、Surface是什么 Handle onto a raw buffer that is being managed by the screen compositor. ⼤概意思是处理由屏幕合成器管理的原理缓存区。
⼆、Surface实现原理 在Surface类⾥有⼀个Canvas对象,在Canvas⾥有⼀个Bitmap,Bitmap是真正的画布。
Bitmap是什么 Bitmap缩写是BMP,是⼀种存储像素的数据结构。
三、Surface跨进程间传递 源码:frameworks/base/core/java/android/view/Surface.java/*** Handle onto a raw buffer that is being managed by the screen compositor.** <p>A Surface is generally created by or from a consumer of image buffers (such as a* {@link android.graphics.SurfaceTexture}, {@link android.media.MediaRecorder}, or* {@link android.renderscript.Allocation}), and is handed to some kind of producer (such as* {@link android.opengl.EGL14#eglCreateWindowSurface(android.opengl.EGLDisplay,android.opengl.EGLConfig,ng.Object,int[],int) OpenGL},* {@link android.media.MediaPlayer#setSurface MediaPlayer}, or* {@link android.hardware.camera2.CameraDevice#createCaptureSession CameraDevice}) to draw* into.</p>** <p><strong>Note:</strong> A Surface acts like a* {@link ng.ref.WeakReference weak reference} to the consumer it is associated with. By* itself it will not keep its parent consumer from being reclaimed.</p>*/public class Surface implements Parcelable {……} Surface继承⾃Parcelable,Parcelable是⼀个序列化接⼝,将对象转化为⼆进制流(⼆进制序列)的过程。
SurfaceHolder版本:Android 2.2 r1结构继承关系public interface SurfaceHolderandroid.view.SurfaceHolder概述抽象接口持有人显示表面。
允许您控制面的大小和格式,编辑在suface的橡树,并监测到变化。
此接口通常可通过SurfaceView类来实现。
当一个线程使用不同于正在运行的线程的SurfaceView的接口时,你应该仔细阅读lockCanvas()和Callback.surfaceCreated()这两个抽象函数常量值public static final int SURFACE_TYPE_GPU常数已声明不赞成使用,已过时。
被忽略,该常量值在需要时自动设置。
S urface类型:创建适用于GPU加速的Surface常量值:2 (0x00000002)public static final int SURFACE_TYPE_HARDWARE常数已声明不赞成使用,已过时。
被忽略,该常量值在需要时自动设置。
S urface类型:创建适用于DMA(Direct memory access )引擎和硬件加速的Surface常量值:1 (0x00000001)public static final int SURFACE_TYPE_NORMALS urface类型:创建用RAM缓存原生数据的普通Surface常量值:0 (0x00000000)public static final int SURFACE_TYPE_PUSH_BUFFERSS urface类型:创建一个不包含原生数据Surface,Surface用到的数据由其他对象提供。
如果设置这种类型则就不能调用lockCanvas来获取Canvas对象了,否则将出现错误。
常量值:3 (0x00000003)公共方法public abstract void addCallback (SurfaceHolder.Callback callback)给Surface持有者添加回调接口,一个持有者可以关联多个回调接口。
Android 5.0(Lollipop)中的SurfaceTexture,TextureView, SurfaceView和GLSurfaceView SurfaceView, GLSurfaceView, SurfaceTexture以及TextureView是Android当中名字比较绕,关系又比较密切的几个类。
本文基于Android 5.0(Lollipop)的代码理一下它们的基本原理,联系与区别。
SurfaceView从Android 1.0(API level 1)时就有。
它继承自类View,因此它本质上是一个View。
但与普通View不同的是,它有自己的Surface。
我们知道,一般的Activity包含的多个View会组成View hierachy的树形结构,只有最顶层的DecorView,也就是根结点视图,才是对WMS可见的。
这个DecorView在WMS中有一个对应的WindowState。
相应地,在SF中对应的Layer。
而SurfaceView自带一个Surface,这个Surface在WMS中有自己对应的WindowState,在SF中也会有自己的Layer。
如下图所示:也就是说,虽然在App端它仍在View hierachy中,但在Server端(WMS和SF)中,它与宿主窗口是分离的。
这样的好处是对这个Surface的渲染可以放到单独线程去做,渲染时可以有自己的GL context。
这对于一些游戏、视频等性能相关的应用非常有益,因为它不会影响主线程对事件的响应。
但它也有缺点,因为这个Surface不在View hierachy中,它的显示也不受View的属性控制,所以不能进行平移,缩放等变换,也不能放在其它ViewGroup 中,一些View中的特性也无法使用。
GLSurfaceView从Android 1.5(API level 3)开始加入,作为SurfaceView的补充。
Android Surfaceview双缓冲机制原理1. 介绍在Android开发中,使用SurfaceView可以实现复杂的图像绘制和动画效果。
而SurfaceView的双缓冲机制能够提高绘制性能和流畅度。
2. SurfaceView概述SurfaceView是一种特殊的View,允许我们在一个单独的线程中进行UI更新和渲染工作,与普通的View不同,SurfaceView拥有一个独立的Surface图层,可以直接与底层硬件进行交互,从而提供更好的绘制性能。
3. SurfaceView的工作原理SurfaceView的绘制工作是在一个后台线程中完成的,这个线程被称为“渲染线程”或“绘制线程”。
SurfaceView内部会创建一个Surface,该Surface用于绘制图像。
3.1. Surface的创建和回调Surface是通过SurfaceHolder接口创建的,并在SurfaceHolder.Callback中监听Surface的生命周期。
当Surface被创建时,渲染线程会自动开始绘制工作。
3.2. 绘制工作的流程渲染线程在循环中不断地执行绘制操作,持续更新Surface上的图像。
具体的绘制流程如下:1.锁定Surface的像素缓冲区,获取Canvas对象。
2.执行绘制操作,比如绘制图形、文本或者位图。
3.通过Canvas对象将绘制的内容提交到Surface上。
4.解锁Surface的像素缓冲区,将绘制的内容显示在屏幕上。
3.3. Surface双缓冲机制SurfaceView的双缓冲机制是通过两个Surface来实现的,一个用于显示,称为”前面缓冲区”,另一个用于绘制,称为”后面缓冲区”。
双缓冲机制的工作原理如下:1.绘制线程先在后面缓冲区进行绘制操作。
2.绘制完毕后,将后面缓冲区的内容复制到前面缓冲区。
3.前面缓冲区的内容立即显示在屏幕上。
4.继续绘制线程的绘制操作,不断更新后面缓冲区的内容。
Android Surface系统的实现
梁铁
杭州海康威视数字技术股份有限公司浙江省杭州市310052
摘要:
安卓的图形显示系统负责应用用户界面窗口的绘制,它是安卓系统中一个重要且复杂的模块。
窗口管理服务和图形混合服务是图形显示系统的核心服务,通过分析二者的工作流程对了解安卓图形显示系统起到很大的帮助。
关键词:
安卓系统、图形显示系统、图形混合系统、窗口管理服务
Android Surface Realization
Liangtie
Hikvision Digital Technology Co., Ltd
Hangzhou,Zhejiang Province,310052
Abstract:
Android surface system is responsible for drawing the User Interface Window of android application, it’s a very complicate and important module in the android system. WindowManagerService and SurfaceFlinger service are the key services in the Android Surface System. To analyze these services work flow is very important to understand the android surface system.
Keywords:
Android、Surface、SurfaceFlinger、WindowManagerService
作者简介:梁铁、1980、男、工程师/工学硕士、主要研究方向:嵌入式系统视频编解码实现。
正文:
Android图形显示
Android应用通常由一个或多个基本组件组成,Activity是负责应用与用户交互的组件,内部包括Window窗口。
图1是Android应用和Surface系统交互的流程框图,通过一系列的操作步骤,对Activity和WMS、SurfaceFlinger之间的关系进行初步的展示
1)系统启动一个新的Activity。
2)WMS为Activity创建一个Phone Window类型的窗口, 并注册到WMS。
3)SurfaceFlinger为Surface分配资源,通过共享内存的方式,与应用共同操作
Surface数据缓冲区。
4)应用在Surface上绘制UI窗口的全部视图。
5)SurfaceFlinger把全部应用的Surface图形数据混合起来进行显示输出。
通过对一个Android应用
Activity图形显示流程的分析,对掌握Surface架构
的运行机制,有很大的帮助。
图1 Surface流程示意图
作者简介:梁铁、1980、男、工程师/工学硕士、主要研究方向:嵌入式系统视频编解码实现。
WindowManagerService (WMS)
WMS是由System_Server进程启动的,负责应用程序窗口的创建、控制和管理等工作,并完成系统消息的收集和分发工作。
如图2所示。
应用请求创建窗口时,和应用直接交互的是WindowManagerImpl对象,它会创建一个ViewRoot类负责与WMS的交互。
IWindowSession和IWindow是标准的aidl接口,用于ViewRoot和WMS之间的交互。
其中,IWindowSession接口用于ViewRoot与WMS内部类Session进行跨进程通信。
IWindow接口用于WMS调用ViewRoot内部的W 类,完成派发按键消息等功能。
WMS会创建一个SurfaceComposerClient对象与窗口对应,它是与SurfaceFlinger 服务进行交互的接口。
图2. Activity与WMS交互示意图
SurfaceFlinger
SurfaceFlinger也是由System_Server进程启动系统服务进程,它负责分配和管理Surface图形显示系统需要的资源,并完成SurfaceCompose图形混合的工作用于显示。
如图3所示,SurfaceFlinger服务创建Layer对象对应Activity的Surface,并作者简介:梁铁、1980、男、工程师/工学硕士、主要研究方向:嵌入式系统视频编解码实现。
按照Z轴顺序进行管理。
SurfaceFlinger通过调用Android定义的显示设备HAL层DisplayHardware,为Layer分配GraphicBuffer显示缓冲区。
一般为一个Layer分配两个GraphicBuffer,方便进行PageFlipping显示操作(FrontBuf用于输出,BackBuf 用于绘制)。
SurfaceFlinger服务为每个SurfaceComposerClient创建Client类对象。
Client对象里面包括一个创建在共享缓冲区上的SharedClient对象。
Activity和SurfaceFlinger通过这个对象实现对GraphicsBuffer的访问同步。
SharedClient有31个SharedBufStack对用来管理GraphicBuffer,因此每个Activity 最多可以支持31个Surface图层显示。
图3. SurfaceFlinger显示层管理
Activity Surface视图绘制
应用通过调用以下三步骤,完成UI窗口视图的绘制:
1)LockCanvas,获取并锁定Surface对应的GraphicsBuf中的BackBuffer,与Canvas
绑定,用来存储Surface图形内容。
2)图形绘制。
Canvas类封装了图形绘制函数,通过调用这些功能函数可以完成
视图绘制的工作。
若系统支持GPU硬件加速,则使用GPU完成视图绘制工作,否则ARM完成相关的工作。
作者简介:梁铁、1980、男、工程师/工学硕士、主要研究方向:嵌入式系统视频编解码实现。
3)unlockCanvasAndPost,解除BackBuffer锁定,完成PageFlip(BackBuffer和
FrontBuffer交换), 发送信号给SurfaceFlinger,进行SurfaceCompose工作。
图4. Surface绘制调用过程图
SurfaceFlinger Surface Compose
SurfaceFlinger系统服务进行Surface Compose的工作流程,如图5所示。
1.等待事务处理或等待重绘事件。
2.如果有事务请求,则进行事务处理。
比如窗口90度旋转操作等。
3.各个Layer从GraphicBuffer中的FrontBuffer中获取新数据,并生成一张
OpenGL中的纹理信息。
4.按照Zorder设置顺序,利用OpenGL接口绘制每个LAYER的纹理信息。
5.遍历各个显示层的finishPageFlip函数,释放FrontBuffer。
6.Surface Compose后的图像用来显示。
作者简介:梁铁、1980、男、工程师/工学硕士、主要研究方向:嵌入式系统视频编解码实现。
图5 SurfaceFlinger工作流程图
结语:
在android surface系统中,WindowManagerService服务实现系统对应用activity窗口管理和消息派发等功能,SurfaceFlinger服务实现系统显示资源管理和应用图形统一绘制、输出功能。
参考文献:
[1] 邓凡平.深入理解Android:卷Ι.北京:机械工业出版社,2011.9
[2] 金泰延宋亨周朴知勋等.Android框架解密北京:人民邮电出版社 2012.4
[3] 李刚. 疯狂Android讲义. 北京:电子工业出版社.2011.7
作者简介:梁铁、1980、男、工程师/工学硕士、主要研究方向:嵌入式系统视频编解码实现。