Android GUI 的更新过程

Android GUI 的更新过程
2011-05-25 17:41

From: http://www.linuxgraphics.cn/android/gui_update_flow.html

组件图

相关组件如下图所示:

  • ViewRoot

在private void draw(boolean fullRedrawNeeded)中,会调用lockCanvas,从而获取一个Canvas对象,然后调用递归调用子窗口(View)的draw函数去绘制自己,最后调用unlockCanvasAndPost让Surface把自己更新到屏幕上。

    canvas = surface.lockCanvas(dirty);
    mView.draw(canvas);
    surface.unlockCanvasAndPost(canvas);
  • android/view/Surface

它主要对一些native函数的包装。

    private native Canvas lockCanvasNative(Rect dirty);
    public native   void unlockCanvasAndPost(Canvas canvas);
  • android_view_Surface.cpp

这是native函数的实现。

Surface_lockCanvas它先锁住Surface,从而获取Surface相关的信息,如果格式、宽度、高度和像素缓冲区。然后创建一个bitmap,这个bitmap和View共享一个像素缓冲区,这样View就能直接把自己绘制到Surface上了。

    status_t err = surface->lock(&info, &dirtyRegion);
    bitmap.setPixels(info.bits);
    nativeCanvas->setBitmapDevice(bitmap);

Surface_unlockCanvasAndPost它断开SkCanvas与Surface之间的关系,然后调用Surface的unlockAndPost。
    nativeCanvas->setBitmapDevice(SkBitmap());
    status_t err = surface->unlockAndPost();
  • surfaceflinger_client/Surface.cpp

Surface::lock调用dequeueBuffer获取一个可用的Buffer,dequeueBuffer会调用SharedBufferClient::dequeue等到backbuffer可用,然后锁住这个Buffer并填充相关信息。

    status_t err = dequeueBuffer(&backBuffer);
    err = lockBuffer(backBuffer.get());

Surface::unlockAndPost先unlock Buffer,然后调queueBuffer显示Buffer。
    status_t err = mLockedBuffer->unlock();
    err = queueBuffer(mLockedBuffer.get());

Surface::queueBuffer是比较有意思的,它设置更新的区域,然后通知服务端(SurfaceFlinger)。
    mSharedBufferClient->setDirtyRegion(bufIdx, mDirtyRegion);
    err = mSharedBufferClient->queue(bufIdx);
    client->signalServer();

通过binder发送请求给服务:
    virtual void signal() const
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
        remote()->transact(BnSurfaceComposer::SIGNAL, data, &reply, IBinder::FLAG_ONEWAY);
    }
  • SurfaceFlinger
    BnSurfaceComposer::onTransact
    case SIGNAL: {
        CHECK_INTERFACE(ISurfaceComposer, data, reply);
        signal();
    } break;

这是SurfaceFlinger中处理SIGNAL的代码,它调用SurfaceFlinger::signal,再调用 
SurfaceFlinger::signalEvent,最后调用MessageQueue::invalidate唤醒是 
SurfaceFlinger的主循环。

在主循环中waitForEvent返回,再handleRepaint去合成个Layer/Surface。

    bool SurfaceFlinger::threadLoop()
    {
        waitForEvent();
        handleRepaint();
        postFramebuffer();
    }

SurfaceFlinger::handleRepaint会调用composeSurfaces把需要绘制各个Surface合并起来,绘制到FrameBuffer的BackBuffer上。
    for (size_t i=0 ; i<count ; ++i) {
        const sp<LayerBase>& layer = layers[i];
        const Region& visibleRegion(layer->visibleRegionScreen);
        if (!visibleRegion.isEmpty())  {
            /* broncho cy add */
            #ifdef USEOVERLAY
            mToppest[1] = mToppest[0];
            mToppest[0] = layer->getIdentity();
            #endif
            /* broncho end */
            const Region clip(dirty.intersect(visibleRegion));
            if (!clip.isEmpty()) {
                layer->draw(clip);
            }
        }
    }

SurfaceFlinger::postFramebuffer最后把FrameBuffer的BackBuffer显示到屏幕上:
hw.flip(mInvalidRegion); -->eglSwapBuffers(dpy, surface);

【surfaceflinger源码分析】RenderSurface与FramebufferSurface之间的关系 surfaceflinger中合成时,合成之后的数据bufferqueue的生产者和消费之之间的关系,RenderSurface与FramebufferSurface的关系 阅读详情

相关推荐

Android 中的 framebuffer 和SurFace的关系(GUI更新过程

作者: 李先静 xianjimli@gmail.com通过这个GUI更新过程来说明 Framebuffer 和 Surface/SurfaceFlinger之间的关系 viewRoot --->view.surface--->surface(surfaceclient)   =======>surfaceFlinger  ----->framebuffer(fb0)  具体图片参考http://www.linuxgraphics.cn/android/gui_update_flow.htmlViewRoot

shuwu 7520

Android4.2.2 SurfaceFlinger本地的FramebufferSurface实现真正的显示

本文均属自己阅读源码的点滴总结,转账请注明出处谢谢。欢迎和大家交流。qq:1037701636 email:gzzaigcn2012@gmail.comAndroid源码版本Version:4.2.2; 硬件平台 全志A31 FrameBufferSurface类,SurfaceFlinger处的本地的帧缓存,实际意义上的显存FramebufferSurface::FramebufferSurfa

天才之嵌入式 9107

SurfaceFlinger -- FramebufferSurface 详解

1: FramebufferSurface 概述 FramebufferSurface 根据名字解析: 1: Surface 说明它是一个Surface, 那么它就会拥有一个 BufferQuere, 用于显示。 2: FrameBuffer 这和 Linux 的 framebuffer 是完全不同的。 但是作用有些类似, SurfaceFlinger 在上面作画, 并把它交给HWC, 最终

ouo555的专栏 8788

Android SurfaceFlinger导读(10)理解DisplayDevice

本章节思维导图如上。主要讲述了DisplayDevice的概念,这里 主要DisplayDevice的创建流程和 两个关键方法makeCurrent 和swapBuffer。在之前的分析中,我们知道 每个应用端对应一个SurfaceControl,每个SurfaceControl都对应多个Surface,即 应用端使用Surface来管理Buffer。实际上在SurfaceFlinger中 DisplayDevice也是通过Surface来管理Buffer。应用端的Buffer是向Ashmem申请的;

wangdsh的博客 6290

Android GUI更新过程

Android GUI更新过程 2011-08-18 18:46 4706人阅读 评论(1) 收藏 举报 androidsignalbufferinterfacelayer 1.ViewRoot 在private void draw(boolean fullRedrawNeeded)中,会调用lockCanvas,从而获取一个Canvas对象,然后调用递归调用子窗口(View)的dra

wanglongwang201209的专栏 445

Android中的FrameBuffer

转载时请注明出处和作者联系方式 文章出处:http://www.limodev.cn/blog  作者联系方式:李先静   FrameBuffer 在Android中并不像在其它GUI那样直观,抽象的层次比较多,加上GUI的更新是通过OpenGLES来做的。所以让人很难搞清GUI更新的整个流 程,最近要准备一个讲稿,所以花了一些去研究,这里做点笔记供大家参考,源代码是基于高通平台

tigerly的专栏 620

android sdk repository,Android SDK支持存储库不会更新(Android SDK Support Repository Won't Update)...

I'm trying to build a script that automatically updates the Android SDK when updates are available, but I'm having trouble.When I execute the command android list sdk from the command line I get the f...

weixin_42206399的博客 392

如何快速安全地移除安卓预装应用:Universal Android Debloater完整指南

安卓手机预装应用过多导致设备卡顿、电池耗电快、隐私泄露?Universal Android Debloater(UAD)正是解决这些问题的终极工具!这款跨平台GUI工具采用Rust语言编写,通过ADB连接帮助非Root安卓设备安全移除预装应用,显著提升设备隐私保护、安全性和电池续航能力。 ## 🔍 为什么你需要移除安卓预装应用? 安卓设备厂商和运营商经常预装大量"垃圾应用",这些应用不仅占用

gitblog_00303的博客 324

Universal Android Debloater:非Root安卓设备终极清理指南

还在为手机预装应用占用空间和消耗资源而烦恼吗?Universal Android Debloater(简称UAD)是一款基于Rust开发的跨平台GUI工具,通过ADB技术无需Root权限即可安全清理安卓设备的冗余系统应用。这款**安卓优化神器**能显著提升**设备性能**、延长**电池续航**并增强**隐私安全**,让你的设备焕然一新! ## 为什么你的安卓设备需要深度清理? 安卓厂商预装的"

gitblog_00900的博客 855
上一篇: Android GUI 的更新过程
下一篇: Android 中的 framebuffer
wwater
博客等级 码龄19年 1粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值