设为首页 加入收藏

TOP

「Android」SurfaceFlinger分析(一)
2019-09-01 23:14:08 】 浏览:96
Tags:Android SurfaceFlinger分析

本篇针对surfaceFlinger模块进行分析,目录如下:

1、SurfaceFlinger功能

  1.1、BufferQueue原理(native/libs/gui模块)

  1.2   layer显示内存分配(native/libs/ui模块)

  1.3、surfaceFlinger处理(native/.../surfaceFlinger模块

2、工程代码解析:

  2.1、surfaceFlinger启动过程

  2.2、surfaceFlinger事务处理 

3、总结(处理流程、交互模块)

***********************************************************×*********************************×*******

 

1、SurfaceFlinger功能:

surfaceflinger作用是接受多个来源的图形显示数据,将他们合成,然后发送到显示设备。
比如打开应用,常见的有三层显示,顶部的statusbar底部或者侧面的导航栏以及应用的界面,每个层是单独更新和渲染,这些界面都是有surfaceflinger合成一个刷新到硬件显示。
在显示过程中使用到了 bufferqueue,surfaceflinger作为consumer方,比如windowmanager管理的surface作为生产方产生页面,交由surfaceflinger进行合成。

1.1、BufferQueue原理(和SF交互)

bufferqueue分为生产者和消费者
比如应用通过windowsmanager分配一个surface,需要分配(dequeueBuffer)显示空间在上面进行绘图,在图形绘制完成后需要推送(queueBuffer)到surfaceflinger进行合成显示。
surfaceflinger作为消费者,通过acquireBuffer()得到一个要合成的图形,在合成完毕后再releaseBuffer()将图形释放。
(1)在bufferQueuei所在目录下  ComposerService 为单例模式负责与surfaceflinger 建立binder连接,在native/libs/gui库
代码如下:
class ComposerService : public Singleton<ComposerService>
{
    sp<ISurfaceComposer> mComposerService;
    sp<IBinder::DeathRecipient> mDeathObserver;
    Mutex mLock;

    ComposerService();
    void connectLocked();
    void composerServiceDied();
    friend class Singleton<ComposerService>;
public:

    // Get a connection to the Composer Service.  This will block until
    // a connection is established.即getComposerService
    static sp<ISurfaceComposer> getComposerService();
};

(2)ComposerService 为单例模式负责与surfaceflinger建立binder连接;

(3)SurfaceComposerClient则在于surfaceflinger建立连接后(即getComposerService)建立与Client的连接,

  通过client调用createSurface,然后返回SurfaceControl;

(4)SurfaceControl负责这个显示层的控制。

sp<Surface> SurfaceControl::getSurface() const
{
    Mutex::Autolock _l(mLock);
    if (mSurfaceData == 0) {
        // This surface is always consumed by SurfaceFlinger, so the
        // producerControlledByApp value doesn't matter; using false.
        mSurfaceData = new Surface(mGraphicBufferProducer, false);
    }
    return mSurfaceData;
}
通过SurfaceControl::getSurface(),得到的真正的显示层,这样之后可以通过Lock和unlock将surface空间分配绘图,再返回给surfaceflinger。

1.2 layer显示内存分配

(1)surface创建后得到 mGraphicBufferProducer,new GraphicBuffer分配一个GraphicBuffer:

int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) {.....}

(2) 在graphicbuffer.cpp中分配一个共享内存,在native/libs/ui模块:

GraphicBuffer::GraphicBuffer(...){...}
status_t GraphicBuffer::initWithSize(...){...}

(3)GraphicBufferAllocator::get() 使用gralloc进行内存分配,分配完成后,得到bufferIdx 将他发给client端也就是surface端

(4)返回虚拟地址给上层

 

1.3、surfaceFlinger处理

 上面创建一个surface后,surfaceflinger对应的是一个layer,当上层layer调用刷新后,onFrameAvailable被调用,通知surfaceflinger有layer更新

void BufferLayer::onFrameAvailable(const BufferItem& item) {
    mFlinger->signalLayerUpdate();
}

 

 

2、工程代码解析:

2.1、surfaceFlinger启动过程:

(代码取自其他博客提供下载的源码https://blog.csdn.net/ztguang/article/details/64905058,Android7.0以上)

 1、surfaceFlinger代码仓位置:/frameworks/native/services/surfaceflingers

    surfaceFlinger启动进程的脚本是surfceFlinger.rc文件,内容如下:

1 service surfaceflinger /sy
首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇gradle配置国内镜像 下一篇Android Studio Git 分支使用实践

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目